Maison  >  Article  >  base de données  >  Deux façons d'ajouter des bases de données esclaves sans arrêter le service MySQL

Deux façons d'ajouter des bases de données esclaves sans arrêter le service MySQL

怪我咯
怪我咯original
2017-04-06 18:09:291481parcourir

L'environnement de production actuelBase de données MySQL a un maître et un esclave À mesure que le volume d'activité continue d'augmenter, une base de données esclave est ajoutée. Le principe est que cela ne peut pas affecter l'utilisation commerciale en ligne, ce qui signifie que le service MySQL ne peut pas être redémarré. Afin d'éviter d'autres situations, choisissez de fonctionner pendant la faible période de pointe du trafic du site Web.

Généralement, il existe deux façons d'ajouter une base de données esclave en ligne. La première consiste à sauvegarder la base de données principale via mysqldump et à la restaurer sur la base de données esclave. la quantité de données est importante, la vitesse de sauvegarde sera très rapide si elle est lente, le verrouillage de la table prendra beaucoup de temps. L'autre consiste à sauvegarder la base de données principale via l'outil xtrabackup et à la restaurer dans la base de données esclave. xtrabackup est une sauvegarde physique, qui a une vitesse de sauvegarde rapide et ne verrouille pas les tables. Pourquoi ne pas verrouiller la table ? Parce qu'il surveillera le journal de la base de données principale, s'il y a des données mises à jour , elles seront d'abord écrites dans un fichier, puis renvoyées dans le fichier de sauvegarde pour maintenir la cohérence des données.

Informations sur le serveur :

  • Base de données principale : 192.168.18.212 (original)

  • Base de données esclave 1 : 192.168.18.213 (original)

  • Base de données esclave 2 : 192.168.18.214 (Nouveau )

  • Version de la base de données : MySQL5.5

  • Moteur de stockage : Innodb

  • Nom de la bibliothèque de test : weibo

1. Méthode mysqldump

Le maître-esclave MySQL est basé sur le journal binlog, donc binlog doit être activé après l'installation de la base de données. L'avantage est que d'une part, vous pouvez utiliser binlog pour restaurer la base de données, et d'autre part, vous pouvez préparer le maître et l'esclave.

Les paramètres de configuration d'origine de la base de données principale sont les suivants :

# vi my.cnf
server-id = 1             #id要唯一
log-bin = mysql-bin         #开启binlog日志
auto-increment-increment = 1   #在Ubuntu系统中MySQL5.5以后已经默认是1
auto-increment-offset = 1 
slave-skip-errors = all      #跳过主从复制出现的错误

1 Créez un compte de synchronisation pour la base de données principale

mysql> grant all on *.* to 'sync'@'192.168.18.%' identified by 'sync';

. 2. Configurez MySQL à partir de la base de données

# vi my.cnf
server-id = 3             #这个设置3
log-bin = mysql-bin         #开启binlog日志
auto-increment-increment = 1   #这两个参数在Ubuntu系统中MySQL5.5以后都已经默认是1
auto-increment-offset = 1 
slave-skip-errors = all      #跳过主从复制出现的错误

3. Sauvegardez la base de données principale

# mysqldump -uroot -p123 --routines --single_transaction --master-data=2 --databases weibo > weibo.sql

Description du paramètre :

  • –routines : exporter procédures stockées et fonctions

  • – single_transaction : définir l'état d'isolement de la transaction lorsque l'exportation démarre et démarre avec une transaction d'instantané cohérente, puis déverrouiller les tables ; lock-tables verrouille une table et ne peut pas écrire d'opérations tant que le vidage n'est pas terminé.

  • –master-data : La valeur par défaut est égale à 1, et le point de départ du vidage (changer le maître en) le point binlog et la valeur pos sont écrits dans le résultat lorsqu'ils sont égaux à 2, le maître de modification est écrit dans le résultat et annoté.

4. Copiez la bibliothèque de sauvegarde dans la bibliothèque esclave

# scp weibo.sql [email protected]:/home/root

5. Créez la table test_tb dans la bibliothèque principale. pour simuler la base de données Pour ajouter de nouvelles données, weibo.sql n'existe pas

mysql> create table test_tb(id int,name varchar(30));

6 Importez la base de données de sauvegarde depuis la base de données

# mysql -uroot -p123 -e 'create database weibo;'
# mysql -uroot -p123 weibo < weibo.sql

7. Dans Sauvegardez le fichier weibo.sql et vérifiez les valeurs binlog et pos

# head -25 weibo.sql
-- CHANGE MASTER TO MASTER_LOG_FILE=&#39;mysql-bin.000001&#39;, MASTER_LOG_POS=107;   #大概22行

8. Synchronisez les paramètres de la bibliothèque esclave à partir de ce point de journal et start

mysql> change master to master_host=&#39;192.168.18.212&#39;,
    -> master_user=&#39;sync&#39;,
    -> master_password=&#39;sync&#39;,
    -> master_log_file=&#39;mysql-bin.000001&#39;,
    -> master_log_pos=107;
mysql> start slave;
mysql> show slave status\G;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    90
Current database: *** NONE ***
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.18.212
                  Master_User: sync
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 358
               Relay_Log_File: mysqld-relay-bin.000003
                Relay_Log_Pos: 504
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
......
Vous pouvez voir que les threads IO et SQL sont OUI, indiquant que la configuration maître-esclave est réussie.

9. Consultez les tableaux de la bibliothèque Weibo depuis la bibliothèque

mysql> show tables;
+---------------------------+
| Tables_in_weibo           |
+---------------------------+
| test_tb                   |

发现刚才模拟创建的test_tb表已经同步过来!

二、xtrabackup方式(推荐)

在上面配置基础上做实验,先删除掉从库配置:

mysql> stop slave;         #停止同步
mysql> reset slave;        #清除从连接信息
mysql> show slave status\G;   #再查看从状态,可以看到IO和SQL线程都为NO
mysql> drop database weibo;   #删除weibo库

此时,从库现在和新装的一样,继续前进!

1. 主库使用xtrabackup备份

# innobackupex --user=root --password=123 ./

生成一个以时间为命名的备份目录:2015-07-01_16-49-43

# ll 2015-07-01_16-49-43/
total 18480
drwxr-xr-x 5 root root     4096 Jul  1 16:49 ./
drwx------ 4 root root     4096 Jul  1 16:49 ../
-rw-r--r-- 1 root root      188 Jul  1 16:49 backup-my.cnf
-rw-r----- 1 root root 18874368 Jul  1 16:49 ibdata1
drwxr-xr-x 2 root root     4096 Jul  1 16:49 mysql/
drwxr-xr-x 2 root root     4096 Jul  1 16:49 performance_schema/
drwxr-xr-x 2 root root    12288 Jul  1 16:49 weibo/
-rw-r--r-- 1 root root       21 Jul  1 16:49 xtrabackup_binlog_info
-rw-r----- 1 root root       89 Jul  1 16:49 xtrabackup_checkpoints
-rw-r--r-- 1 root root      563 Jul  1 16:49 xtrabackup_info
-rw-r----- 1 root root     2560 Jul  1 16:49 xtrabackup_logfile

2. 把备份目录拷贝到从库上

# scp -r 2015-07-01_16-49-43 [email protected]:/home/root

3. 从库上把MySQL服务停掉,删除datadir目录,将备份目录重命名为datadir目录

# sudo rm -rf /var/lib/mysql/
# sudo mv 2015-07-01_16-49-43/ /var/lib/mysql
# sudo chown mysql.mysql -R /var/lib/mysql
# sudo /etc/init.d/mysql start
# ps -ef |grep mysql    #查看已经正常启动
mysql     8832     1  0 16:55 ?        00:00:00 /usr/sbin/mysqld

4. 在主库创建test_tb2表,模拟数据库新增数据

mysql> create table test_tb2(id int,name varchar(30));

5. 从备份目录中xtrabackup_info文件获取到binlog和pos位置

# cat /var/lib/mysql/xtrabackup_info 
uuid = 201af9db-1fce-11e5-96b0-525400e4239d
name = 
tool_name = innobackupex
tool_command = --user=root --password=... ./
tool_version = 1.5.1-xtrabackup
ibbackup_version = xtrabackup version 2.2.11 based on MySQL server 5.6.24 Linux (x86_64) (revision id: )
server_version = 5.5.43-0ubuntu0.12.04.1-log
start_time = 2015-07-01 16:49:43
end_time = 2015-07-01 16:49:46
lock_time = 1
binlog_pos = filename &#39;mysql-bin.000001&#39;, position 429    #这个位置
innodb_from_lsn = 0
innodb_to_lsn = 1598188
partial = N
incremental = N
format = file
compact = N
compressed = N

6. 从库设置从这个日志点同步,并启动

mysql> change master to master_host=&#39;192.168.18.212&#39;,
    -> master_user=&#39;sync&#39;,
    -> master_password=&#39;sync&#39;,
    -> master_log_file=&#39;mysql-bin.000001&#39;,
    -> master_log_pos=429;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.18.212
                  Master_User: sync
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 539
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 363
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
......

可以看到IO和SQL线程均为YES,说明主从配置成功。

9. 从库查看weibo库里面的表

mysql> show tables;
+---------------------------+
| Tables_in_weibo           |
+---------------------------+
| test_tb                   |

发现刚才模拟创建的test_tb2表已经同步过来。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn