Відновлення раба за допомогою LVM
Ось метод, який ми використовуємо для відновлення рабів MySQL за допомогою Linux LVM. Це гарантує послідовний знімок, вимагаючи дуже мінімального простою для вашого майстра.
Встановіть innodb max брудних сторінок відсотків до нуля на майстер-сервері MySQL. Це змусить MySQL записати всі сторінки на диск, що значно прискорить перезапуск.
set global innodb_max_dirty_pages_pct = 0;
Для контролю кількості брудних сторінок виконуйте команду
mysqladmin ext -i10 | grep dirty
Як тільки кількість зупинок зменшиться, ви досягнете точки, щоб продовжувати. Далі скиньте майстер, щоб очистити старі журнали та журнали реле:
RESET MASTER;
Виконайте lvdisplay, щоб отримати LV Path
lvdisplay
Вихід буде виглядати приблизно так
--- Logical volume ---
LV Path /dev/vg_mysql/lv_data
LV Name lv_data
VG Name vg_mysql
Вимкніть головну базу даних за допомогою команди
service mysql stop
Далі зробіть знімок, нове логічне ім'я тома буде mysql_snapshot. Якщо бінлоги розміщені на диску накопичувача, вони також повинні бути знімними.
lvcreate --size 10G --snapshot --name mysql_snapshot /dev/vg_mysql/lv_data
Почніть знову майстер з командою
service mysql start
Відновіть налаштування брудних сторінок за замовчуванням
set global innodb_max_dirty_pages_pct = 75;
Запустіть lvdisplay ще раз, щоб переконатися, що знімок є і видно
lvdisplay
Вихід:
--- Logical volume ---
LV Path /dev/vg_mysql/mysql_snapshot
LV Name mysql_snapshot
VG Name vg_mysql
Зробіть знімок
mkdir /mnt/mysql_snapshot
mount /dev/vg_mysql/mysql_snapshot /mnt/mysql_snapshot
Якщо у вас є існуючий підлеглий MySQL, вам потрібно зупинити його
service mysql stop
Далі потрібно очистити папку даних MySQL
cd /var/lib/mysql
rm -fr *
Назад до майстра. Тепер виконуйте синхронізацію знімка на підлеглому MySQL
rsync --progress -harz /mnt/mysql_snapshot/ targethostname:/var/lib/mysql/
Після завершення програми rsync ви можете відключити та вийняти знімок
umount /mnt/mysql_snapshot
lvremove -f /dev/vg_mysql/mysql_snapshot
Створіть користувача реплікації на майстрі, якщо старого користувача реплікації не існує або пароль невідомий
GRANT REPLICATION SLAVE on *.* to 'replication'@'[SLAVE IP]' identified by 'YourPass';
Перевірте, що / var / lib / mysql файлами даних належить користувач mysql, якщо так, ви можете опустити таку команду:
chown -R mysql:mysql /var/lib/mysql
Далі запишіть бінлогічну позицію
ls -laF | grep mysql-bin
Ви побачите щось подібне
..
-rw-rw---- 1 mysql mysql 1073750329 Aug 28 03:33 mysql-bin.000017
-rw-rw---- 1 mysql mysql 1073741932 Aug 28 08:32 mysql-bin.000018
-rw-rw---- 1 mysql mysql 963333441 Aug 28 15:37 mysql-bin.000019
-rw-rw---- 1 mysql mysql 65657162 Aug 28 16:44 mysql-bin.000020
Тут головний файл журналу - найвищий номер файлу в послідовності, а позиція журналу біна - розмір файлу. Запишіть ці значення:
master_log_file=mysql-bin.000020
master_log_post=65657162
Далі запустіть підлеглий MySQL
service mysql start
Виконати головну команду зміни на підлеглому, виконавши наступне:
CHANGE MASTER TO
master_host="10.0.0.12",
master_user="replication",
master_password="YourPass",
master_log_file="mysql-bin.000020",
master_log_pos=65657162;
Нарешті запустити раба
SLAVE START;
Перевірити статус рабовласників:
SHOW SLAVE STATUS;
Переконайтесь, що Slave IO працює і немає помилок підключення. Удачі!
BR, Juha Vehnia
Нещодавно я написав це у своєму блозі, який можна знайти тут ... Є ще кілька деталей, але історія така ж.
http://www.juhavehnia.com/2015/05/rebuilding-mysql-slave-using-linux-lvm.html
--opt --single-transaction --comments --hex-blob --dump-date --no-autocommit --all-databases