KsI-wiki online documents

Mysql

Материал из Ksimute

Перейти к: навигация, поиск

Содержание

Создание пользователя и базы.

 #cat gen_base.sh
 #!/bin/bash
   
 DATABASE="upXXX"
 USERNAME="upXXX"
 PASSWORD="SecurePassword"
 
 
 #echo "Enter mysql root password:"
 #read -s ROOT_PW
 ROOT_PW="RootMysqlPassword"
 
 mysqladmin -u root --password=$ROOT_PW  create $DATABASE
 
 mysql -u root --password=$ROOT_PW -e "GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,CREATE ROUTINE,
                                         CREATE TEMPORARY TABLES,CREATE VIEW,EXECUTE,INDEX,SHOW VIEW, ALTER ROUTINE
                                          on $DATABASE.* to '$USERNAME'@'%' IDENTIFIED by '$PASSWORD';"

Репликация master-slave

Сначала включаем на мастере бинарные логи.

 vi /etc/mysql/my.cnf
 server-id              = 11
 log_bin                 = /var/log/mysql/mysql-bin.log
 # WARNING: Using expire_logs_days without bin_log crashes the server! See README.Debian!
 expire_logs_days        = 10
 max_binlog_size         = 100M
 binlog_do_db            = mydatabase
 #binlog_ignore_db       = include_database_name

Потом идем на мастер, делаем.

 grant replication slave on *.* to 'repl_user'@'%' identified by 'SecurePassword';

Делаем дамп на мастере

 mysqldump --single-transaction --master-data=2 mydatabase  | bzip2 >database.bz2

или

 :~#  mysqldump --single-transaction --master-data=2 --all-databases  | bzip2 >database.bz2


На слэйве

 # vi /etc/mysq/my.cnf
 server-id=2
 master-connect-retry=60
 replicate-do-db=mydatabase
 mysql> CHANGE MASTER TO MASTER_HOST='masterHost', MASTER_USER='repl_user',MASTER_LOG_FILE=, MASTER_LOG_POS=,
 MASTER_PASSWORD='SecurePassword';
 mysql> START SLAVE;
 mysql> show slave status;

Read_Master_Log_Pos: 5002 Пошла репликация!

MASTER_LOG_FILE=, MASTER_LOG_POS= - берутся из дампа вверху.

Если строим сложную репликацию елочкой. т.е.

  master-> slave\master -> (salve1,slave2,...slaveXXX)

не забываем на slave\master включить

  log-slave-updates = 1

По-умолчанию, раб не пишет лог об обновлениях получаемых с мастера в свой бинарный лог. Эта опция говорит ему писать начать.

Пропустить 1 запрос на слэйве (бывает нужно когда реплика ломается):

 mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;

Корректный способ удаления бинарных логов на мастере:

 mysql> show master status;
 +------------------+----------+--------------+------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
 +------------------+----------+--------------+------------------+
 | mysql-bin.000972 |      106 |              |                  |
 +------------------+----------+--------------+------------------+
 1 row in set (1.32 sec)
 
 mysql> PURGE BINARY LOGS TO 'mysql-bin.000972';
 Query OK, 0 rows affected (26.83 sec)  
 mysql> 

можно также указывать дату

 PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';

Как построить еще одного слэйва.

Мастер нагружать дампом смысла нет, да и не всегда это возможно.

Собственно по шагам: 1. стопим слэйв 2. смотрим статус и сохраняем его SHOW SLAVE STATUS \G; 3. дампим данные 4. стартуем 5. везем данные на новый сервер 6. заливаем из дампа смотрим статус который сохранили после остановки слэйва.

Ключевое поле:

Exec_Master_Log_Pos The position in the current master binary log file to which the SQL thread has read and executed, marking the start of the next transaction or event to be processed. You can use this value with the CHANGE MASTER TO statement's MASTER_LOG_POS option when starting a new slave from an existing slave, so that the new slave reads from this point.

The coordinates given by (Relay_Master_Log_File, Exec_Master_Log_Pos) in the master's binary log correspond to the coordinates given by (Relay_Log_File, Relay_Log_Pos) in the relay log.