Mysql tips

понедельник, 30 марта 2009 г.
- Проверить целостность базы данных можно командой:
# /usr/bin/mysqlcheck -a DBName

- Выгрузить базу MySQL можно командой:
# mysqldump -u root -p DBName > mydb.sql
Если mysqldump не запускается, то нужно указать полный путь до этого файла, который можно узнать командой:
# find / -name mysqldump
/usr/local/mysql-3.23.54a-pc-linux-i686/bin/mysqldump
Сами базы MySQL хранит в /var/lib/mysql/db/, здесь можно посмотреть какие базы созданы.
Чтобы загрузить базу, нужно сначала создать пустую, а для надёжности предварительно удалить старую:
# 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 и выбираем все строки, касающиеся этого пользователя:
# 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;
Загружаем базу командой:
# mysql -u root -p mysql < mysqldb.sql

- Внести запись в базу данных из 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`

Несколько полезных команд: 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; # применить внесённые изменения
mysql -u root -p12345 postfix < DB.sql # пакетное выполнение SQL выражений для базы данных postfix
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

0 коммент.:

Отправить комментарий