You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
docs/docs/blog/posts/mysql.md

324 lines
9.1 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# MySQL / MariaDB
## Настройки
Список настроечных параметров и их значения
```sql
mysqld --verbose --help
```
## Управление пользователями
Список пользователей
```sql
mysql> SELECT User,Host FROM mysql.user;
```
Список прав у пользователя root@localhost
```sql
mysql> SHOW GRANTS FOR root@localhost;
```
Создание нового пользователя
```sql
mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'secret';
```
Добавим выбранные привилегии для всех таблиц БД *dbname* пользователю *'user'@'localhost'*
```sql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX
ON dbname.* TO 'user'@'localhost';
```
Добавим все привилегии для всех таблиц БД *dbname* пользователю *'user'@'localhost'*
```sql
mysql> GRANT ALL PRIVILEGES ON dbname.* TO 'user'@'localhost';
```
Удаление прав пользователя 'user'@'localhost' для БД *dbname*:
```sql
mysql> REVOKE ALL ON dbname.* FROM 'user'@'localhost';
```
Удаление пользователя:
```sql
mysql> DROP USER user@localhost;
```
Перезагрузка привилегий
```sql
mysql> FLUSH PRIVILEGES;
```
Новый пароль для root
```sql
$ mysqladmin -uroot password 'secret'
```
## Управление базой данных
Создание базы данных
```sql
mysql> CREATE DATABASE dbname COLLATE utf8_general_ci;
```
Создание базы данных из консоли
```sql
$ mysqladmin -u root -p create dbname
```
Удаления базы данных из консоли
```sql
mysqladmin -u root -p drop dbname
```
## Другие sql-команды
Замена в поле определенной подстроки на другую
```sql
mysql> UPDATE table SET field=replace(field, 'original string', 'new string');
```
Вставка данных из одной таблицы в другую
```sql
mysql> INSERT INTO table1 (fld1, fld2) SELECT table2.fld1, table2.fld2 FROM table2 WHERE table2.fld2 > 7;
```
Просмотр структуры таблицы blog\_posts
```sql
mysql> DESCRIBE blog_posts;
```
Просмотр sql-запроса на создание структуры таблицы blog\_posts
```sql
mysql> SHOW CREATE TABLE blog_posts;
```
## Мониторинг и статистика
Список всех баз данных
```sql
mysql> SHOW DATABASES;
```
Список всех таблиц в выбранной базе данных
```sql
mysql> SHOW TABLES;
```
Статистика по работе сервера
```sql
mysql> SHOW GLOBAL STATUS;
```
- [Install Innotop to Monitor MySQL Server Performance](http://www.tecmint.com/install-innotop-to-monitor-mysql-server-performance/)
- [Install Mtop (MySQL Database Server Monitoring)](http://www.tecmint.com/install-mtop-mysql-database-server-monitoring-in-rhel-centos-6-5-4-fedora-17-12/)
- [Check The Number Of MySQL Open Database Connections on Linux Or Unix-like Server](http://www.cyberciti.biz/faq/howto-show-mysql-open-database-connections-on-linux-unix/)
## Оптимизация баз данных
При помощи команды mysqlcheck можно выполнять проверку, оптимизацию и исправление ошибок.
Поверка на ошибки БД dbname
```sql
$ mysqlcheck -p dbname
```
Восстановление и оптимизация всех БД
```sql
$ mysqlcheck -Aor -p
```
Описание аргументов
- `-p` использовать пароль
- `-A` проверять все базы данных
- `-r` ремонтировать БД
- `-o` оптимизировать БД
Скрипт простой оптимизации БД, можно добавить в крон для выполнение раз в сутки
```sql
mysqlcheck --repair --analyze --optimize --all-databases --auto-repair -u root -p SECRET
```
## Изменение строки приглашения (prompt)
В` ~/.my.cnf `добавим
```sql
[client]
default-character-set = 'utf8'
pager = 'less -n -i -S'
prompt = '\u@\h [\d] > '
user = 'root'
password = 'secret'
```
Делают эти настройки следующие
- устанавливаем кодировку по-умолчанию в utf8
- используем less для вывода результатов запроса
- меняем строку приглашения, \\u - пользователь, \\h - хост, \\d - база данных
- указываем логин и пароль для mysql-консоли, удобно при разработке на локальном сервере
## Дамп (резервная копия)
Дамп базы данных
```sql
$ mysqldump -uroot -p dbname > dump.sql
```
Дамп выбранных баз
```sql
$ mysqldump -uroot -p -B dbname1 dbname2 > dump.sql
```
Дамп всех баз
```sql
$ mysqldump -uroot -p -A > dump.sql
```
Дамп только структуры, без данных
```sql
$ mysqldump -uroot -p --no-data dbname > database.sql
```
Другие опции
- `--add-drop-tabl`e - добавляет команду DROP TABLE перед каждой командой CREATE TABLE
- `--add-locks` - добавляет команду LOCK TABLES перед выполнением и UNLOCK TABLE после выполнения каждого дампа таблицы
- `--no-create-db, -n` - не добавлять команду CREATE DATABASE, которая добавляется при использовании параметров --databases и --all-databases
- `--no-data, -d` - дампить только структуру таблиц
- `--no-create-info, -t` - не создавать команду CREATE TABLE
- `--skip-comments` - не выводить комментарии.
- `--compact` - использовать компактный формат
- `--create-options` - добавляет дополнительную информацию о таблице в команду CREATE TABLE: тип, значение AUTO\_INCREMENT и т.д. Не нужные опции можно вырезать с помощью sed.
- `--extended-insert, -e` - применение команды INSERT с многострочным синтаксисом (повышает компактность и быстродействие операторов ввода)
- `--tables` - дампить только таблицы из списка, следующего за этим параметром, разделитель - пробел
Применение дампа
```sql
$ mysql -uroot -p dbname1 < dump.sql
```
## Изменение кодировка для текстового поля
Список полей для таблицы table с информацией о поле, в том числе и кодировка поля
```sql
SHOW FULL COLUMNS FROM table;
```
Меняем charset для поля field
```sql
ALTER TABLE table MODIFY field VARCHAR(255) CHARACTER SET utf8;
```
## Изменение кодировка при импорте с дампа
Определение кодировки файла
```sql
file --mime-encoding dump.sql
```
Конвертирование из кодировки latin1 в utf8
```sql
mysqldump --add-drop-table -uroot -p dbname | replace CHARSET=latin1 CHARSET=utf8 | iconv -f latin1 -t utf8 | mysql -uroot -p dbname
```
## Восстановление root-пароля
```sql
$ service mysqld stop
$ mysqld_safe --skip-grant-tables &
$ mysql
mysql> UPDATE mysql.user SET Password=PASSWORD('secret') WHERE User='root';
mysql> FLUSH PRIVILEGES;
$ service mysqld restart
```
## MySQL + Python
Иногда при компиляция MySQL-python может выскочить такая ошибка *configure: error: mysql\_config executable not found*, это значит, что не установлен пакет _libmysqlclient15-dev_. Под Ubuntu устанавливается так
```sql
sudo apt-get install libmysqlclient15-dev
```
## Перенос директории с данным (data directory)
Останавливаем MySQL
```sql
service mysqld stop
```
Копируем существующею директорию с данными в новое место
```sql
mkdir -p /path/new/dir
sudo chown -R mysql:mysql /path/new/dir
sudo cp -R -p /var/lib/mysql /path/new/dir
```
Укажем в my.cnf путь к новой директории, секция mysqld
```sql
# sudo vim /etc/mysql/my.cnf
[mysqld]
datadir=/path/new/dir/mysql
```
Запускаем MySQL
```sql
service mysqld start
```
## Как конвертировать MyISAM в InnoDB
Просмотр всех таблиц и их типов
```sql
SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database' and ENGINE = 'myISAM'
```
Следущая комманда конвертирует таблицу в InnoDB
```sql
ALTER TABLE table1 ENGINE=InnoDB;
```