MySQL主从复制(M-S传统/GTID)

MySQL主从复制:

注:不等于备份

实时同步
机械故障
远程灾备
用于备份
高可用HA
负载均衡
读写分离
分布式数据库
复制技术原理:
1、主==>开启二进制日志(将DDL DML DCL记录)
2、备==>IO线程读取主二进制日志,复制到中继日志
3、备==>SQL线程读取中继日志,将其重放到数据库上
1.png
主库:
# 开启binlog并设置server-id
vim /etc/my.cnf
[mysqld]
log-bin=
server-id=1

说明:log-bin 不指定,则以《主机名-bin》,存放在/var/lib/mysql/ 下

# 重启数据库
systemctl restart mysqld

扩展:
# 查看mysql日志相关的
mysql> show variables like 'log_%';

# 创建复制账号并授权:
mysql> grant REPLICATION SLAVE, REPLICATION CLIENT on *.*
-> to rep@'192.168.174.%' identified by 'ZShj26@1200';

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
创建测试数据:
# 创建数据库
mysql> create database student;
Query OK, 1 row affected (0.00 sec)

# 创建表
mysql>  create table student(
    ->     id int(4) not null AUTO_INCREMENT,
    ->     name char(20) not null,
    ->     age tinyint(2) not null default '0',
    ->     dept varchar(16) default null,
    -> primary key(id),
    -> KEY index_name(name)
    ->     );
Query OK, 0 rows affected (0.16 sec)

#查看表
mysql> 
mysql> show tables;
+------------------+
| Tables_in_oldboy |
+------------------+
| student          |
+------------------+
1 row in set (0.00 sec)

# 查看表结构
mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(4)      | NO   | PRI | NULL    | auto_increment |
| name  | char(20)    | NO   | MUL | NULL    |                |
| age   | tinyint(2)  | NO   |     | 0       |                |
| dept  | varchar(16) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

# 插入数据:
mysql> insert into student(id,name,age,dept) values
(1,'zhangsan','23','book'),
(2,'zhangsan1','24','book1'),
(3,'zhangsan2','25','book2'),
(4,'zhangsan3','26','book3');
# 查看数据
mysql> select * from student;
+----+-----------+-----+-------+
| id | name      | age | dept  |
+----+-----------+-----+-------+
|  1 | zhangsan  |  23 | book  |
|  2 | zhangsan1 |  24 | book1 |
|  3 | zhangsan2 |  25 | book2 |
|  4 | zhangsan3 |  26 | book3 |
+----+-----------+-----+-------+
4 rows in set (0.00 sec)
数据备份:
[root@mysql_node1 ~]# mysqldump -p'ZShj26@1200' --all-databases --single-transaction --master-data=1 --flush-logs >`date +%F`-mysql-all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

[root@mysql_node1 ~]# sed -n '22p' 2019-06-08-mysql-all.sql 
CHANGE MASTER TO MASTER_LOG_FILE='mysql_node1-bin.000002', MASTER_LOG_POS=154;

将数据拷贝到从库:
[root@mysql_node1 ~]# scp 2019-06-08-mysql-all.sql mysql_node2:/
root@mysql_node2's password: 
2019-06-08-mysql-all.sql     100%  776KB  33.0MB/s   00:00
从库:
# 设置server-id
[mysqld]
server-id=2
在从服务器上,可以选择不开启binlog。当开启了binlog后,如果想把重放的时间同样也记录到binlog中,可将log_slave_updates参数设置为1。

# 重启数据库:
systemctl restart mysqld

# 测试复制账号是否可以远程连接上:(如果连接不上请关闭主库的防火墙)
[root@mysql_node1 ~]# mysql -hmysql_node1 -urep -p'ZShj26@1200';

# 查看授权:
mysql> show grants;
+-----------------------------------------------------------------------------+
| Grants for rep@192.168.174.%                                                |
+-----------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'rep'@'192.168.174.%' |
+-----------------------------------------------------------------------------+
1 row in set (0.00 sec)

# 导入数据
不建议:(这种方式导入,开启复制的时候需要手动指定binlog和postion)
[root@mysql_node2 ~]# mysql -p'ZShj26@1200' < /2019-06-08-mysql-all.sql  

建议:(这种方式就可以省略指定binlog和postion)
# 不记录bin-log日志
mysql> set sql_log_bin=0;

# 数据导入
mysql> source /2019-06-08-mysql-all.sql 
主库模拟增加数据:
mysql> insert into student(id,name,age,dept) values
(5,'zhangsan4','23','book4'),
(6,'zhangsan5','24','book5'),
(7,'zhangsan6','25','book6'),
(8,'zhangsan7','26','book7');
从库:
# 开启复制
mysql> CHANGE MASTER TO
MASTER_HOST='mysql_node1',
MASTER_USER='rep',
MASTER_PASSWORD='ZShj26@1200';

# 如果不是source的方式导入,就需要手动指定:
MASTER_LOG_FILE='mysql_node1-bin.000002',
MASTER_LOG_POS=recorded_log_position;

怎么获取到这两个值呢?(备份的时候加了参数  --master-data=1  (不注释))
sed -n 22p 2019-06-08-mysql-all.sql  

# 开启复制功能(启动slave角色)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
# 查看状态是否正常(重点关注以下两个变量,如果为YES,则代表复制搭建成功)
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: mysql_node1
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql_node1-bin.000002
          Read_Master_Log_Pos: 1372
               Relay_Log_File: mysql_node2-relay-bin.000004
                Relay_Log_Pos: 1597
        Relay_Master_Log_File: mysql_node1-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1372
              Relay_Log_Space: 1863
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 5715e8f1-89ae-11e9-a2c2-000c29a6956b
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)


-------参数说明----------
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Master_Host: mysql_node1           #master主机
Master_User: rep                   #master用户
Master_Port: 3306                  #数据库端口
Read_Master_Log_Pos: 1372          #读取到主服务器的position位置  
Relay_Log_Pos: 1597                #从服务器SQL线程已经执行和处理过的中继日志位置
Seconds_Behind_Master: 0           #这个等于0的话就代表主从同步正常并且没有延迟


mysql> SHOW GLOBAL VARIABLeS LIKE '%log%';          =======》log_bin | ON   (启用二进制日志) 
                                                    =======》 relay_log_purge | ON (启用中继日志)   

mysql> SHOW GLOBAL VARIABLES LIKE '%server%';       =======》server_id | 1  (为配置文件设置的数值)     



# 查看数据(可以看出不在备份文件的5、6、7、8条数据都同步过来)
mysql> select * from student;
+----+-----------+-----+-------+
| id | name      | age | dept  |
+----+-----------+-----+-------+
|  1 | zhangsan  |  23 | book  |
|  2 | zhangsan1 |  24 | book1 |
|  3 | zhangsan2 |  25 | book2 |
|  4 | zhangsan3 |  26 | book3 |
|  5 | zhangsan4 |  23 | book4 |
|  6 | zhangsan5 |  24 | book5 |
|  7 | zhangsan6 |  25 | book6 |
|  8 | zhangsan7 |  26 | book7 |
+----+-----------+-----+-------+
8 rows in set (0.00 sec)
主从复制(M-S)GTID
主库:跟着上面的步骤配置
# 修改配置文件
vim /etc/my.cnf
log-bin
server-id=1
gtid_mode=ON
enforce_gtid_consistency=1

# 重启mysql
systemctl restart mysqld

从库:
# 跟着上面的步骤配置,将从库的数据rm(慎用!慎用!慎用!)
[root@mysql_node2 ~]# rm -rf  /var/lib/mysql

# 修改配置文件
server-id=2
log-bin
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE

# 不写上面的参数,就是以文件的方式保存,加上上面的参数就是以数据库的方式存放
查看方式:(里面记录复制账号、密码、主机、端口、uuid)
mysql> select  *   from mysql.slave_master_info\G

# 重启数据库
[root@mysql_node2 ~]# systemctl restart mysqld

主库:
# 备份数据(--master-data=2  是1还是2都没多大关闭,我们就选2注释)
mysqldump -p'ZShj26@1200' --all-databases --single-transaction --master-data=2 --flush-logs >`date +%F`-mysql-all.sql

# 拷贝到mysql_node2
scp 2019-06-09-mysql-all.sql mysql_node2:/

# 创建复制账号并授权:
mysql> grant REPLICATION SLAVE, REPLICATION CLIENT on *.*
-> to rep@'192.168.174.%' identified by 'ZShj26@1200';

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)



从库:
# 测试复制账号是否可以远程连接上:(如果连接不上请关闭主库的防火墙)
[root@mysql_node2 ~]# mysql -hmysql_node1 -urep -p'ZShj26@1200';

# 查看授权:
mysql> show grants;
+-----------------------------------------------------------------------------+
| Grants for rep@192.168.174.%                                                |
+-----------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'rep'@'192.168.174.%' |
+-----------------------------------------------------------------------------+
1 row in set (0.00 sec)

# 备份数据导入
GTID模式不需要手动指定binlog和postion,下面2种方式导入都可以

1、命令行
mysql -p'ZShj26@1200' < /2019-06-08-mysql-all.sql  

2、mysql里面
mysql> set sql_log_bin=0;
mysql> source /2019-06-09-mysql-all.sql 

# 开启复制
mysql> change master to 
master_host='mysql_node1',
master_user='rep',
master_password='ZShj26@1200',
master_auto_position=1;

# 开启复制功能(启动slave角色)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

问题1:
Slave_IO_Running: Connecting
开启复制的时候,master_user=‘rep’ 写错了

问题2:
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

解决:
[root@mysql_node2 ~]#  systemctl stop mysqld.service
[root@mysql_node2 ~]# mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak
[root@mysql_node2 ~]# systemctl start mysqld
[root@mysql_node2 ~]# cat /var/lib/mysql/auto.cnf
[auto]
server-uuid=ad0bd229-8ab3-11e9-8c9c-000c2991b69e


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容