Заметка по работе с MySQL
Суббота, утро. Хочется немного отвлечься от работы =)
Решил собрать самое основное и запилить статью о том: как делать бэкапы, как эти бэкапы разворачивать, на какой информации стоит стороить оптимизацию Вашей MySQL и т.д.
Backup (экспорт и импорт)
Экспорт данных из MySQL
1) Бэкап всех баз данных (структура и данные)
mysqldump -u USER -pPASSWORD DATABASE > /path/to/file/dump.sql
2) Бэкап структуры (только структура, без данных)
mysqldump --no-data - u USER -pPASSWORD DATABASE > /path/to/file/schema.sql
3) Бэкап только одной или нескольких таблиц
mysqldump -u USER -pPASSWORD DATABASE TABLE1 TABLE2 TABLE3 > /path/to/file/dump_table.sql
4) Бэкап + архивирование
mysqldump -u USER -pPASSWORD DATABASE | gzip > /path/to/outputfile.sql.gz
5) Бэкап с указанием его даты в названии файла дампа
mysqldump -u USER -pPASSWORD DATABASE | gzip > `date +/path/to/outputfile.sql.%Y%m%d.%H%M%S.gz`
Импорт данных в MySQL
1) Заливаем бекап в базу данных
mysql -u USER -pPASSWORD DATABASE < /path/to/dump.sql
2) Заливаем архив бекапа в базу данных
gunzip < /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASE
или так
zcat /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASE
3) Удобно делать бекап с дополнительными опциями, например: -Q -c -e
mysqldump -Q -c -e -u USER -pPASSWORD DATABASE > /path/to/file/dump.sql
-Q - оборачивает имена обратными кавычками
-c - делает полную вставку, включая имена колонок
-e - делает расширенную вставку. Итоговый файл получается меньше и делается он чуть быстрее
Полезное
1) Создаём новую базу данных
mysqladmin -u USER -pPASSWORD create NEWDATABASE
2) Список баз данных пользователя
mysqlshow -u USER -pPASSWORD
3) Список таблиц базы данных
mysqlshow -u USER -pPASSWORD DATABASE
4) Дополнительные ключики
Для таблиц InnoDB надо добавлять –single-transaction, это гарантирует целостность данных бекапа.
Для таблиц MyISAM это не актуально, ибо они не поддерживают транзакционность.
Рекомендации
Рекомендуется под каждую базу на боевом сервере - создавать отдельного пользователя.
Кодировка базы может быть любой, если она UTF-8.
В большинстве случаев лучше использовать движок InnoDB
В php лучше забыть про сильно устаревшее расширение mysql и по-возможности использовать pdo или mysqli
Не стоит открывать MySQL наружу. Вместо этого можно сделать проброс портов: ssh -fNL LOCAL_PORT:localhost:3306 REMOTE_USER@REMOTE_HOST
Работа с данными
Числа
На 32-битных системах практически нет смысла ставить для типа INTEGER свойство UNSIGNED, так как такие большие числа в php могут не поддерживаться.
На 64-битных системах, php поддерживает большие числа, вплоть до MySQL BIGINT со знаком.
Связанные таблицы Foreign keys должны иметь полное сходство по структуре ключей. Т.е. если у нас на одной таблице для поля указано «INTEGER UNSIGNED DEFAULT 0 NOT NULL» то и на другой должно быть указано аналогично.
Для хранения булевых значений, нужно использовать TINYINT(1)
А деньги лучше хранить в DECIMAL(10, 2), где первое число обозначает количество всех знаков, включая запятую, а второе — количество знаков после запятой. Итого, у нас получится что DECIMAL(10,2) может сохранить 9999999,99
Строки
В старых версиях (до 5.0.3) VARCHAR была ограничена 255 символами, но сейчас можно указывать до 65535 символов.
Помните, что тип TEXT ограничен только 64 килобитами, поэтому что бы сохранять «Войну и Мир» пользуйтесь LONGTEXT
Самая правильная кодировка для вашей БД - UTF-8
Даты
Не забывайте, что:
DATE, TIME, DATETIME — выводятся в виде строк, поэтому поиск и сравнение дат происходит через преобразование
TIMESTAMP — хранится в виде UNIX_TIMESTAMP, и можно указать автоматически обновлять колонку
Сравнивая типы данных DATETIME и TIMESTAMP, не забывайте делать преобразование типов, например:
SELECT * FROM table WHERE `datetime` = DATE(`timestamp`)
Перечисления
Для перечислений правильно использовать тип ENUM
Правильно пишется так: ENUM(‘мама’, ‘мыла’, ‘раму’)
Можно ставить значение по-умолчанию, как и для любой строки.
В базе поле с перечислением хранится как число, поэтому скорость работы — потрясающе высокая.
Количество перечислений ~ 65 тысяч.
Отладка
Если запросы тормозят, то можно включить лог для медленных запросов в /etc/mysql/my.cnf
А потом оптимизировать запросы через EXPLAIN
И наблюдать за запросами удобно через утилиту mytop.