MySQL
Содержание |
Общее
- Базы MySQL храняться в /var/lib/mysql/db
- phpMyAdmin - Работа с MySQL через web интерфейс
Перенос БД (Резервное копирование и восстановление)
Выгрузить БД можно с помощью phpMyAdmin или mysqldump:
# mysqldump -u root -p DBName > mydb.sql
Если mysqldump не запускается, то нужно указать полный путь до этого файла, который можно узнать командой:
# find / -name mysqldump /usr/local/mysql-3.23.54a-pc-linux-i686/bin/mysqldump
Чтобы загрузить базу, нужно сначала создать пустую, а для надёжности предварительно удалить старую:
# mysql -u root -p mysql> drop database if exists DBName; mysql> create database DBName; mysql> quit
а затем в неё загрузить данные:
# mysql -u root -p DBName < mydb.sql
Если для пользователя root в MySQL нет пароля, то параметр -p не нужен, также можно задать пароль явным образом, только без пробела, например -pPassWord. Далее нужно убедиться, что в новой базе есть тот пользователь, от имени которого происходило обращение к базе. Если такого нет, то простой способ дать все привилегии одному пользователю:
mysql> GRANT ALL PRIVILEGES ON dbName.* TO UserName@localhost IDENTIFIED BY 'UserPassword';
чтоб создать в точности такого же пользователя как на старом месте с соответствующими правами, выгружаем базу mysql и выбираем все строки, касающиеся этого пользователя:
# mysqldump -u root -p mysql > mysqldb.sql
В файле mysqldb.sql останется приблизительно следующее:
INSERT INTO db VALUES ('%','DBName','UserName','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
INSERT INTO host VALUES ('localhost','UserName','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
INSERT INTO user VALUES ('localhost', 'UserName', '','N','N','N','N','N','N','N','N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', 0, 0, 0);
При переходе с одной версии MySQL на другую нужно учитывать, что количество параметров скорее всего будет разным, поэтому команду INSERT придётся подредактировать. Также может изменится алгоритм шифрования паролей. Сколько именно параметров можно узнать выполнив:
mysql> SHOW COLUMNS FROM db;
Можно указать только интересующие поля, а остальные примут значение по умолчанию:
INSERT INTO `user` (`Host`, `User`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`) VALUES ('localhost','stacc','Y','Y','Y','Y');
Загружаем базу командой:
# mysql -u root -p mysql < mysqldb.sql
Команды
Команды ОС
| mysql -u root -p12345 postfix < DB.sql | пакетное выполнение SQL выражений для базы данных postfix |
| /usr/bin/mysqlcheck -a DBName или |
Проверка целостности БД |
| mysqldump -u root -p DBName > mydb.sql | Выгрузка (дамп) базы MySQL |
Команды MySQL
| SHOW DATABASES; | показать все имеющиеся базы данных |
| SHOW TABLES; | показать таблицы в текущей БД |
| SHOW COLUMNS FROM db; | показать поля таблицы db |
| USE mysql; | перейти в БД mysql |
| SELECT host,user FROM user; | показать поля host, user таблицы user |
| DROP TABLE transport; | удалить таблицу transport |
| DELETE FROM user WHERE user='acct' AND host='%'; | удалить конкретную запись |
| UPDATE db SET Delete_priv='Y' WHERE user='acct'; | изменить значение поля в записи |
| FLUSH PRIVILEGES; | применить внесённые изменения |
| ALTER TABLE mailbox ADD (uid int(10) unsigned DEFAULT '107' NOT NULL); | добавляем в таблицу mailbox обязательное поле uid со значением по умолчанию = 107 |
| ALTER TABLE mailbox DROP uid; | удаляем поле uid из таблицы mailbox |
| GRANT ALL PRIVILEGES ON DBName.* TO UserName@localhost IDENTIFIED BY '12345'; | дать все права на базу DBName пользователю UserName, подключающемуся с localhost с паролем 12345 (создаёт пользователя, если его нет) |
| SELECT user,host,db FROM db; | показать какие пользователи, откуда и к каким базам могут подключаться |
| CHECK TABLE TableName; | проверить целостность таблицы TableName |
| REPAIR TABLE TableName; | исправить целостность таблицы TableName |
- Внести запись в базу данных из bash можно таким образом (определив, конечно, переменные):
echo "INSERT INTO table_name (\`in\`,\`out\`) VALUES ('$delta_in', '$delta_out');" > $tmp_dir/temp.sql `mysql -u$db_user -p$db_pass $db_name < $tmp_dir/temp.sql`
Как сбросить пароль root в MySQL
- Останавливаем сервер
- Запускаем его в режиме без проверки привилегий
- Заходим рутом не указывая пароль
- Меняем пароль root
- Выходим
- Перезапускаем сервер
# /etc/init.d/mysqld stop
# mysqld_safe --skip-grant-tables &
# mysql -u root mysql
mysql> update user set Password=PASSWORD('новый_пароль') where User='root';
mysql> quit
# /etc/init.d/mysqld restart
Как сменить префикс в таблицах MySQL
см спец статью и скрипт MySQL_tables_rename
Отладка
По умолчанию MySQL не журналирует выполняемые на нём команды. Нам может это понадобиться для отладки взаимодействующих с ним приложений. У меня возникла такая необходимость при настройке Courier. Включить журналирование можно в файле /etc/init.d/mysql, закоментировав оригинальный запуск программы в секции start и добавив параметр --log:
# /usr/bin/mysqld_safe > /dev/null 2>&1 & /usr/bin/mysqld_safe --log &
http://sysadminwiki.ru/w/index.php?title=MySQL&action=edit§ion=6
Работа над ошибками
ERROR 2003 (HY000): Can't connect to MySQL server on '10.0.0.12' (111)
Причина: Запросы не доходят до сервера MySQL. Причин может быть множество.
Решение: в /etc/mysql/my.cnf изменить параметр bind-address со значения по умолчанию 127.0.0.1 на ip адрес интерфейса, например, внутренней сети:
bind-address = 10.0.0.12
Ссылки
- http://www.opennet.ru/docs/RUS/mysqlrus - Документация на MySQL
- http://dev.mysql.com/doc/refman/5.1/en/show-character-set.html - официальная документация. В имени HTML файла указана команда по которой даётся справка, что удобно для быстрого поиска описания нужной команды