Шпаргалка MySQL
Изучение настоящей шпаргалки не сделает вас мастером SQL, но позволит получить общее представление об этом языке программирования и возможностях, которые он предоставляет. Рассматриваемые в шпаргалке возможности являются общими для всех или большинства диалектов SQL.
Создание дампаmysqldump --all-databases > dump.sql - дамп всех базmysqldump --databases db1 db2 db3 > dump.sql - дамп нескольких указанных бдmysqldump -u USER -pPASSWORD DATABASENAME > dump.sql - дампmysqldump -u USER -pPASSWORD DATABASENAME | gzip > /path/to/outputfile.sql.gz - дамп с упаковкой в gzipmysqldump -u USER -pPASSWORD DATABASENAME | gzip > 'date+/path/to/outputfile.sql.%Y%m%d.%H%M%S.gz' - дамп с упаковкой в gzip и датой созданияmysqldump --no-data - u USER -pPASSWORD DATABASENAME > /path/to/file/schema.sql - копируем структуру БД без данныхmysqldump -u USER -pPASSWORD DATABASENAME TABLE1 TABLE2 TABLE3 > /path/to/file/dump_table.sql - если нужно сделать дамп только одной или нескольких таблиц
Пример бекапа в кроне:
0 0 * * * /usr/bin/mysqldump -u root -pPASSWORD DBNAME | gzip > /home/user/backup_mysql/DBNAME_`date "+\%d-\%m-\%Y_\%H:\%M:\%S"`.sqlВосстановление из дампаmysql -u USER -pPASSWORD DATABASENAME < /path/to/dump.sql - восстановление БД из дампаgunzip < /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASENAME - восстановление БД из дампа в архиве .gzmysql -u USER -pPASSWORD < /path/to/dump.sql - восстановление нескольких БД из дампа
Восстановление из дампа в консоли MySQL
create database mydb;
use mydb;
source /path/to/db_backup.dump;Консоль MySQL CLImysql -u root -p - залогиниться в консоль mysqlshow databases; - показать все БДuse [database]; - выбрать БДshow tables; - показать таблицы БДshow index from [table]; - показать все индексы таблицыdescribe [table]; - структура таблицыcreate database mydb; - создать БД mydbshow status;show processlist;CREATE TABLE [table] ([column] VARCHAR(120), [another-column] DATETIME); - создать таблицуAdding a column: ALTER TABLE [table] ADD COLUMN [column] VARCHAR(120); - добавить столбец в таблицуALTER TABLE [table] ADD COLUMN [column] int NOT NULL AUTO_INCREMENT PRIMARY KEY; - добавить столбец в таблицу с уникальным автоинкрементным IDINSERT INTO [table] ([column], [column]) VALUES ('[value]', '[value]'); - вставить значение в столбец таблицыSELECT * FROM [table]; - вывести значение из таблицыSELECT * FROM [table] ORDER BY ID DESC LIMIT 10 - вывести 10 последних значений из таблицыEXPLAIN SELECT * FROM [table];SELECT [column], [another-column] FROM [table]; - вывести несколько столбцов из таблицыSELECT COUNT([column]) FROM [table]; - посчитать записиSELECT *, (SELECT COUNT([column]) FROM [table]) AS count FROM [table] GROUP BY [column]; - Посчитать и выбрать сгруппированные записиSELECT * FROM [table] WHERE [column] = [value]; (Selectors: <, >, !=; combine multiple selectors with AND, OR) - выбрать определенные записиSELECT * FROM [table] WHERE [column] LIKE '%[value]%'; - Выбрать записи с определенным значениемSELECT * FROM [table] WHERE [column] LIKE '[value]%'; - Выбрать записи с начинающиеся с определенного значенияSELECT * FROM [table] WHERE [column] LIKE '[val_ue]'; - Выбрать записи начинающиеся с val и заканчивающиеся на ueSELECT * FROM [table] WHERE [column] BETWEEN [value1] and [value2]; - Выбрать записи между значениямиSELECT * FROM [table] WHERE [column] ORDER BY [column] ASC LIMIT [value]; (Order: DESC, ASC) - Выбрать с сортировкой по столбцу по возрастанию или убываниюUPDATE [table] SET [column] = '[updated-value]' WHERE [column] = [value]; - Обновление записейDELETE FROM [table] WHERE [column] = [value]; - Удаление заспиейDELETE FROM [table]; - Удалить все записи из таблицы, не дропая талицу, при этом каунтер сбрасываетсяtruncate table [table]; - Удалить все записи из таблицыALTER TABLE [table] DROP COLUMN [column]; - Удалить столбцы из таблицыDROP TABLE [table]; - Уничтожить таблицуDROP DATABASE [database]; - Уничтожить БД
Создание пользователя
CREATE USER 'USERNAME'@'localhost' IDENTIFIED BY 'USERPASSWORD';
GRANT ALL PRIVILEGES ON DBNAME . * TO 'USERNAME'@'localhost';
FLUSH PRIVILEGES;
SELECT User FROM mysql.user; - посмотреть всех пользователейОбщиеmysqlshow -u USER -pPASSWORD - просмотр списка всех БДmysqladmin -u USER -pPASSWORD create NEWDATABASE - создать БД NEWDATABASEmysqlshow -u USER -pPASSWORD DATABASENAME - список всех таблиц БД DATABASENAME
Остальное полезноеdu -sh /var/lib/mysql | sort -gr - узнать размер всех БД
Запрос выведет размер указанной БД:
SELECT table_schema AS "DATABASE_NAME", ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Размер в Мб" FROM information_schema.TABLES GROUP BY table_schemamytop - удобный диспетчер задач для MySQL, как htop, в нем можно убивать процессы в MySQL
В крон добавить 2 задания:
20 1 * * * /usr/bin/mysqlcheck -u root --auto-repair --check --all-databases >/dev/null 2>&1
40 1 * * * /usr/bin/mysqlcheck -u root --auto-repair --optimize --all-databases >/dev/null 2>&1
Для таблиц в InnoDB при создании дампа надо добавлять --single-transaction, это гарантирует целостность данных бекапа. Для таблиц MyISAM это не актуально, ибо они не поддерживают транзакционность.
В большинстве случаев лучше использовать движок InnoDB.
MyISAM | InnoDB | |
| Полнотекстовый поиск | + | > 5.6.4 |
| Транзакции | - | + |
| Блокировка записи | Таблицы | Строки |
MyISAM стоит использовать, если нужен полнотекстовый поиск до версии 5.6. Также этот движок подойдет, когда в таблице очень мало записей и большое количество чтений.
Во всех остальных случаях нужно использовать InnoDB.
Важно под каждую базу на боевом сервере создавать своего пользователя.
Кодировка базы может быть любой, если она UTF8.
В php лучше забыть про сильно устаревшее расширение mysql и по-возможности использовать pdo или mysqli.
Без особой нужды не стоит открывать MySQL наружу. Вместо этого можно сделать проброс портов:
ssh -fNL LOCAL_PORT:localhost:3306 REMOTE_USER@REMOTE_HOST
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.