Данный скрипт, написанный на bash-е, несет собой цель демонстрации алгоритма потабличного восстановления/создания mysql-репликации без даунтайма. В данном конкретном примере подразумевается наличие всех необходимых реквизитов для доступа к master-а и slave-у, а так-же минимальная настройка — наличие учетной записи для репликации на мастере + включенный bin-log.
#!/bin/bash
MASTER_HOST='master-mysql.domain' SLAVE_HOST='slave-mysql.domain' DATABASE='database_name' echo "[i] сбрасываем slave" mysql -h "$SLAVE_HOST" -e "SLAVE STOP;" mysql -h "$SLAVE_HOST" -e "RESET SLAVE;" echo "[i] импорт структуры базы" mysqldump --no-data -h "$MASTER_HOST" "$DATABASE" | sed \ -e 's/ENGINE=MEMORY/ENGINE=BLACKHOLE/g'\ -e 's/ENGINE=InnoDB/ENGINE=BLACKHOLE/g'\ -e 's/ENGINE=MyISAM/ENGINE=BLACKHOLE/g' | mysql -h "$SLAVE_HOST" "$DATABASE" echo "[+] ок" echo "[i] создание slave" mysql -h "$MASTER_HOST" -Nse "SHOW MASTER STATUS;" | awk '{print "CHANGE MASTER TO MASTER_HOST=\"master-mysql.domain\",MASTER_USER=\"repl_user\",MASTER_PASSWORD=\"password\",MASTER_LOG_FILE=\""$1"\",MASTER_LOG_POS="$2";"}' | mysql echo "[i] запуск slave" mysql -e "SLAVE START;" echo "[+] ok" for TABLE in $(mysql -h "$SLAVE_HOST" -Nse "SELECT TABLE_NAME from TABLES WHERE TABLE_SCHEMA='$DATABASE' AND ENGINE='BLACKHOLE';" information_schema); do echo "[i] таблица $TABLE" echo "[i] останавливаем slave" mysql -h "$SLAVE_HOST" -e "STOP SLAVE;" echo "[i] создание дампа" mysqldump --master-data=2 -h "$MASTER_HOST" "$DATABASE" "$TABLE" | gzip > dump.sql.gz echo "[+] ok" echo "[i] готовим слейв" CHANGEMASTER=$(zgrep -m1 'CHANGE MASTER' "dump.sql.gz") if [ $? -ne 0 ]; then echo "[e] CHANGE MASTER отсутствует в дампе $TABLE"; exit 1; fi STARTUNTIL=$(echo "$CHANGEMASTER" | sed 's/-- CHANGE MASTER TO/START SLAVE UNTIL/') mysql -e "$STARTUNTIL" if [ $? -ne 0 ]; then echo "[e] ошибка запуска slave"; exit 1; fi echo "[+] $STARTUNTIL" while true ; do if [ $(mysql -e 'SHOW SLAVE STATUS\G' | grep -E '^\s*(Slave_SQL_Running: No|Slave_IO_Running: Yes)\s*
| wc -l) -eq 2 ]; then echo echo "[+] `date +"%Y-%m-%d %T"` slave готов" break else sleep 1 echo -n . fi done echo "[i] импорт таблицы $TABLE" zcat dump.sql.gz | mysql -h "$SLAVE_HOST" "$DATABASE" rm dump.sql.gz echo "[+] ok" echo "[i] запуск slave" mysql -h "$SLAVE_HOST" -e "START SLAVE;" echo "[+] ok" sleep 1 done