====== MySQL ====== [[http://habrahabr.ru/company/centosadmin/blog/227533/|Бекап баз данных – есть ли он?]] [[http://habrahabr.ru/post/105954/|MySQL шпаргалки habr]] [[http://habrahabr.ru/post/205964/|Ежедневная архивация mysql-баз под windows]] [[http://habrahabr.ru/company/centosadmin/blog/235131/|Наш велосипед или скрипты, облегчающие жизнь админа]] ===== Работа с бекапами ===== **Делаем бекап** ''mysqldump -u USER -pPASSWORD DATABASE > /path/to/file/dump.sql'' **Создаём структуру базы без данных** ''mysqldump --no-data - u USER -pPASSWORD DATABASE > /path/to/file/schema.sql'' **Если нужно сделать дамп только одной или нескольких таблиц** ''mysqldump -u USER -pPASSWORD DATABASE TABLE1 TABLE2 TABLE3 > /path/to/file/dump_table.sql'' **Создаём бекап и сразу его архивируем** ''mysqldump -u USER -pPASSWORD DATABASE | gzip > /path/to/outputfile.sql.gz'' **Создание бекапа с указанием его даты** ''mysqldump -u USER -pPASSWORD DATABASE | gzip > `date +/path/to/outputfile.sql.%Y%m%d.%H%M%S.gz`'' **Заливаем бекап в базу данных** ''mysql -u USER -pPASSWORD DATABASE < /path/to/dump.sql'' **Заливаем архив бекапа в базу** ''gunzip < /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASE'' или так ''zcat /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASE'' **Создаём новую базу данных** ''mysqladmin -u USER -pPASSWORD create NEWDATABASE'' ===== Включить и первичная настройка ===== mysql_enable="YES" [[http://www.lissyara.su/articles/freebsd/programms/mysql/|Установка MySQL на сайте Лиссяры]] ===== Посмотреть список пользователей MySQL ===== SELECT USER from mysql.user; ===== Как посмотреть список таблиц и их структуру в MySQL ===== SHOW DATABASES; - список баз данных SHOW TABLES [FROM db_name]; - список таблиц в базе SHOW COLUMNS FROM таблица [FROM db_name]; - список столбцов в таблице SHOW CREATE TABLE table_name; - показать структуру таблицы в формате "CREATE TABLE" SHOW INDEX FROM tbl_name; - список индексов SHOW GRANTS FOR user [FROM db_name]; - привилегии для пользователя. SHOW VARIABLES; - значения системных переменных SHOW [FULL] PROCESSLIST; - статистика по mysqld процессам SHOW STATUS; - общая статистика SHOW TABLE STATUS [FROM db_name]; - статистика по всем таблицам в базе ===== как узнать права пользователя? ===== SHOW GRANTS FOR root@localhost; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+ ===== как узнать у каких пользователей есть права к конкретной базе? ===== SELECT user,host FROM mysql.db WHERE `db` = 'some_database'; [[http://dev.mysql.com/doc/refman/5.0/en/grant-table-structure.html|Права доступа в MySQL]] ===== Пользователи MySQL ===== Все пользователи MySQL хранятся в таблице user базы mysql. Чтобы посмотреть список пользователей нужно переключиться на базу mysql и сделать выборку с помощью команды select: mysql> use mysql; mysql> select user,host from user; +--------------------+------------+ | user | host | +--------------------+------------+ | root | 127.0.0.1 | | root | testhost | | debian-sys-maint | localhost | | root | localhost | +--------------------+------------+ Из списка видно, что в базе имеются учетные данные суперпользователя //root// с возможностью подключаться только локально с данного сервера(адреса //127.0.0.1, localhost// и имя сервера //testhost//). Еще есть системная учетная запись //debian-sys-maint// служит для внутренних системных целей СУБД MySQL. В предыдущей части я рассказывал как настроить в конфигурационном файле ///etc/mysql/my.cnf// удаленное подключение к серверу баз данных MySQL. Напомню: для этого в параметре //bind-address// выставляется IP адрес //0.0.0.0// вместо //127.0.0.1//, т.е. демон mysqld будет слушать не только локальный интерфейс //127.0.0.1//, а все адреса имеющиеся на сервере. В этой части я расскажу как создать пользователя mysql, какие права выдать для различных пользователей, как выставить пароль и хост с которого будет производиться подключение. ==== Пользователь для веб сайта ==== Обычно различные веб приложения которые хранят информацию в базе //mysql// требуют создать отдельную учетную запись. Создадим пользователя //website-user// от имени которого будет работать наше веб приложение. Пользователя можно создать через команду //create user//, а потом выдать права //grant select,insert//..., но удобнее и быстрее сразу воспользоваться командой //grant// mysql> GRANT SELECT,INSERT,UPDATE,ALTER,DELETE,CREATE,DROP,INDEX ON website.* to 'website-user'@'localhost' IDENTIFIED BY 'website-PASSWORD; mysql> flush privileges; Здесь я сразу указал: * выдать права //GRANT SELECT,INSERT,UPDATE,ALTER,DELETE,CREATE,DROP,INDEX// (возможно для вашего веб приложения список прав будет иной, обратитесь к документации веб приложения); * на базу website.* - имя базы указывается по маске (все файлы с названием website). Здесь можно указать *.*, тогда пользователь будет иметь права на все базы; * 'websiteuser'@'localhost' - имя пользователя, и хост с которого этот пользователь может подключаться в базу; * IDENTIFIED BY 'website-password' - указываем пароль пользователя. ==== Администратор баз данных ==== В следующем примере создадим учетную запись администратора баз данных который будет подключаться с IP адреса компьютера администратора 192.168.8.10 mysql> create user 'admin'@'192.168.8.10' identified by 'blahblahblah'; Query OK, 0 rows affected (0.01 sec) Выдадим полные права пользователю admin на базу website: mysql> grant all on website.* to 'admin'@'192.168.8.10'; mysql> flush privileges; Теперь администратор может подключиться со своего компьютера к серверу баз данных. В этом примере я использовал команду create user, а уже потом grant в принципе разницы нет как будут создаваться пользователи. ==== Пользователь backup ==== Создадим пользователя backup для резервного копирования всех базы данных mysql> GRANT SHOW DATABASES, SELECT, LOCK TABLES, RELOAD ON *.* to 'backup'@'%' identified by 'backup-password'; mysql> flush privileges; * GRANT SHOW DATABASES, SELECT, LOCK TABLES, RELOAD - Здесь я указал необходимый набор прав для удаленного резервного копирования и в то же время достаточный для безопасного бэкапа; * *.* - Пользователь backup может просматривать все базы; * 'backup'@'%' - пользователь backup может подключаться с любого IP адреса. Обычно не требуется разрешать подключения с любого ip для целей резервного копирования, так как у сервера backup всегда постоянный IP адрес. ==== Как поменять пароль? ==== Чтобы поменять пароль можно воспользоваться командой mysqladmin эту команду нужно запускать в bash. mysqladmin -u website-user -p password NEWPASSWORD А так же можно воспользоваться командой (SQL синтаксис) из консоли MySQL mysql> update user set password=PASSWORD("123") where user='website-user'; ==== Как сбросить пароль root? ==== Поменять пароль root можно всеми теми же командами, что и для обычного пользователя. Но вот что делать если вы забыли пароль рута или по каким-то причинам его утеряли, тогда проделаем следующие операции. 1) Первым делом нужно остановить mysqld - демон MySQL сервера /etc/init.d/mysql stop 2) Создать скрипт для смены пароля /root/reset.sql со следующим содержанием: UPDATE mysql.user SET Password=PASSWORD('YOUR-NEW-MYSQL-PASSWORD') WHERE User='root'; FLUSH PRIVILEGES; Сохраняем файл и запускаем демон mysqld в безопасном режиме с параметром --init-file mysqld_safe --init-file=/root/reset.sql & Ответ будет таким nohup: ignoring input and redirecting stderr to stdout Starting mysqld daemon with databases from /var/lib/mysql mysqld_safe[20970]: started Теперь можно просто убить процесс mysqld и запустить север заново: killall mysqld /etc/init.d/mysql start Пароль пользователя root успешно изменен! Логинимся и проверяем. Есть ещё один способ сменить пароль root - это запустить mysqld c параметром --skip-grant-tables и поменять пароль, но я не рекомендую им пользоваться так как это не безопасно и есть вероятно повредить таблицы с правами. [[http://cruw.blogspot.com/2011/11/mysql_13.html]] ===== Replication ===== [[http://habrahabr.ru/post/194918/|Mysql Отложенная репликация или Коммивояжеры с Mysql-slave]]