主从

响应客户端请求的那台服务器作为主,从库自动从主库那里同步更新

主库: 必须启用binlog日志!

从库,有2个子程序:
IO线程: 复制主库binlog日志里的sql命令,到本机的relay-log(中继日志文件)。
SQL线程: 执行本机的relay-log(中继日志文件)里的sql命令。

1,确保数据相同
从库必须要有主库上的数据。
(配置主从同步前,一定要保证从库上有主库上的全部数据!否则之后从库的线程会报错!
如果配置前,主库已经有数据了,就先完全备份给从库,确保数据一样!)

2,配置主服务器
启用binlog日志,授权用户,查看当前正在使用的日志。

3,配置从服务器
指定server_id,指定主库信息。

4,测试配置
客户端连接主库写入新数据,在从库上也能查询到。
######################################################################################
配置master数据库主服务器 (51主库)

mysql> show databases; 可以看到目前有原始的4个库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+

mysql> show master status; 查看目前正在使用的日志
+------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------+----------+--------------+------------------+-------------------+
| plj.000007 | 154 | | | | 正在使用的日志文件名叫plj.000007
+------------+----------+--------------+------------------+-------------------+

# vim /etc/my.cnf
[mysqld]
log_bin=master51 开启binlgog日志,并指定日志名是master51
server_id=51 指定id编号为51
binlog_format="mixed" 记录sql命令和结果,是2者都记录的最全的模式
... ...


# systemctl restart mysqld
# ls /var/lib/mysql/master51.*
/var/lib/mysql/master51.000001 /var/lib/mysql/master51.index

# mysql -uroot -p123qqq...A

mysql> grant replication slave on *.* to
-> repluser@"%" identified by "123qqq...A";

mysql> system mysqlbinlog /var/lib/mysql/master51.000001 | grep -i grant
可以看到如下信息:
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*F19C699342FA5C91EBCF8E0182FB71470EB2AF30'

mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 单词含义: Position(偏移量)
+-----------------+----------+--------------+------------------+-------------------+
| master51.000001 | 441 | | | |
+-----------------+----------+--------------+------------------+-------------------+
###################################################################################
配置master数据库主服务器 (52从库)

# mysql -uroot -p123qqq...A

mysql> show slave status; 显示当前是否是从服务器
Empty set (0.01 sec)


# vim /etc/my.cnf
[mysqld]
server_id=52 添加这行,指定id
#log_bin
#log_bin=plj
#log_bin=/logdir/plj 如果之前有过开启binlog,那么要注释掉
#binlog_format="mixed"
... ...

# systemctl restart mysqld
# mysql -uroot -p123qqq...A

mysql> show master status;
Empty set (0.00 sec)

mysql> show slave status;
Empty set (0.00 sec)


# mysql -h192.168.4.51 -urepluser -p123qqq...A 先尝试能否登陆主库,是否真的有权限

mysql> show grants;
+--------------------------------------------------+
| Grants for repluser@% |
+--------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%' |
+--------------------------------------------------+

mysql> quit

# mysql -uroot -p123qqq...A

mysql> change master to 任何一个配置项指定不对,都会导致线程不运行
-> master_host="192.168.4.51",master_user="repluser",
-> master_password="123qqq...A",
-> master_log_file="master51.000001",
-> master_log_pos=441;
#############################################################################################3
mysql> show slave status\G 查看从库信息(还没启动从库,所以暂时会看到是还没运行的)

显示信息如下:
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.4.51 主库IP
Master_User: repluser 登陆主库的用户名
Master_Port: 3306 主库端口号mysql是3306
Connect_Retry: 60
Master_Log_File: master51.000001 主库的日志文件名
Read_Master_Log_Pos: 441 主库的日志偏移量
Relay_Log_File: mysql52-relay-bin.000001 本机中继日志文件名(只保留最近的2个)
Relay_Log_Pos: 4
Relay_Master_Log_File: master51.000001
Slave_IO_Running: No 本机IO线程。no表示还没运行。显示connecting也是错的。一定要保证是yes!
Slave_SQL_Running: No 本机SQL线程。no表示还没运行。一定要保证是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: 441
Relay_Log_Space: 154
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: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error: IO字段报错信息!如果后面有值,就是IO线程没有起来的原因!
Last_SQL_Errno: 0
Last_SQL_Error: SQL字段报错信息!如果后面有值,就是SQL线程没有起来的原因!
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
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:
#################################################################################################
SQL线程执行操作命令的时候,如果执行的库和表没有,SQL就会马上down掉,状态变为NO。
例如: 执行中继日志位文件命令为insert into db1.a values(1),可是从库上并没有db1库或者a这个表的话,就会马上down掉。
所以必须保证配置主从库之前,必须要保证主从库数据一致!
从库的数据可以比主库多,但绝对不能比主库少!

#################################################################################################
如果IO,SQL没有起来,执行下面步骤。

stop slave;
重新写一遍,改对就行!
mysql> change master to 只要写这个就是重新指定主库的值。任何一个配置项指定不对,都会导致线程不运行
-> master_host="192.168.4.51",master_user="repluser",
-> master_password="123qqq...A",
-> master_log_file="master51.000001",
-> master_log_pos=441;
start slave;
mysql> show slave status\G;

也有可能是51和52的server_id重复了,要改一下。
----------------------------------------------------------------------------------------------------------------------------
可以试着写错
mysql> change master to master_host="192.168.4.54";
只要写这个就是重新指定主库的值。任何一个配置项指定不对,都会导致线程不运行。
######################################################################################
mysql> start slave; 启动复制
mysql> show slave status\G; 查看从库信息

显示信息如下:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000001
Read_Master_Log_Pos: 441
Relay_Log_File: mysql52-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes IO线程已运行!yes表示已经运行
Slave_SQL_Running: Yes SQL线程已运行!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: 441
Relay_Log_Space: 528
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: 51
Master_UUID: aa60dede-ee00-11e8-b86d-5254005802fb
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:
###############################################################################
在客户端主机50测试配置

51操作:
mysql> create database db1;
mysql> create table db1.a(id int);

52操作:
mysql> desc db1.a;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+

51主库操作:
mysql> grant select,insert on db1.* to yaya100@"%" identified by "123qqq...A";

52从库操作:
mysql> select user from mysql.user
-> where user="yaya100";
+---------+
| user |
+---------+
| yaya100 |
+---------+

50客户端:
# mysql -h192.168.4.51 -uyaya100 -p123qqq...A 客户端访问主库,客户端连接的服务器就是主库

mysql> show grants; 查看自己的权限
+--------------------------------------------------+
| Grants for yaya100@% |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO 'yaya100'@'%' |
| GRANT SELECT, INSERT ON `db1`.* TO 'yaya100'@'%' | 看到自己只对db1库有查询和插入记录的权限
+--------------------------------------------------+

mysql> select * from db1.a; 查看表db1.a的内容
Empty set (0.00 sec) 目前表db1.a是空的

mysql> insert into db1.a values(100); 插入记录到表db1.a里
mysql> insert into db1.a values(101);

mysql> select * from db1.a; 查看已成功插入记录到表db1.a里
+------+
| id |
+------+
| 100 |
| 101 |
+------+

51主库操作:
mysql> select * from db1.a; 主库也可以看到客户端插入的新数据
+------+
| id |
+------+
| 100 |
| 101 |
+------+

52从库操作:
mysql> select * from db1.a; 从库也可以看到客户端插入的新数据,说明主从同步成功!
+------+
| id |
+------+
| 100 |
| 101 |
+------+
######################################################################################
52操作:

# cd /var/lib/mysql
# ls
...
mysql52-relay-bin.000001
mysql52-relay-bin.000002
mysql52-relay-bin.index
master.info
relay-log.info

# cat master.info 查看这个文件,之所以重启mysqld之后,它还是从库,就是因为有这个配置文件来告诉它的。我们配置change时产生的
25
master51.000001
1584 日志偏移量
192.168.4.51
repluser
123qqq...A
3306
60
0

 

 

0
30.000

0
aa60dede-ee00-11e8-b86d-5254005802fb
86400


0
##############################################################################################
52取消从库,成为独立的库

# cat mysql52-relay-bin.index
./mysql52-relay-bin.000001
./mysql52-relay-bin.000002

# ls /var/lib/mysql/mysql52-relay-bin.*
/var/lib/mysql/mysql52-relay-bin.000001 /var/lib/mysql/mysql52-relay-bin.index
/var/lib/mysql/mysql52-relay-bin.000002

# mysqlbinlog mysql52-relay-bin.000002 | grep -i insert
GRANT SELECT, INSERT ON `db1`.* TO 'yaya100'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*F19C699342FA5C91EBCF8E0182FB71470EB2AF30'
insert into db1.a values(100)
insert into db1.a values(101)

要想把从库变成独立的服务器,可以把相关的配置文件删除了,就行了。
# rm -rf master.info
# rm -rf mysql52-relay-bin.*
# rm -rf relay-log.info
# systemctl restart mysqld

# mysql -uroot -p123qqq...A -e "show slave status\G" -e可以执行mysql命令,没有搜到从库的相关信息了
##################################################################################################
52重新配置成从库

51操作:
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000001 | 1584 | | | | 查看主库现在的日志文件和偏移量
+-----------------+----------+--------------+------------------+-------------------+

52操作:
mysql> change master to
-> master_host="192.168.4.51",
-> master_user="repluser",
-> master_password="123qqq...A",
-> master_log_file="master51.000001", 这是现在主库的日志文件
-> master_log_pos=1584; 这是现在的偏移量,可以不是现在的偏移量,只要是文件里面有的就行。但是绝对不能是主库不存在的日志文件和偏移量

mysql> start slave;

mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000001
Read_Master_Log_Pos: 1584
Relay_Log_File: mysql52-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000001
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: 1584
Relay_Log_Space: 528
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: 51
Master_UUID: aa60dede-ee00-11e8-b86d-5254005802fb
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:

####################################################################################################
二、主从同步常用配置参数:(配置主从服务器之前,就要想好只同步哪些库!如果只控制自己,就在从库那设置限制。如果想要所有从库,就设置主库的限制。不能两边同时配。工作中一般不做任何限制。)

# vim /etc/my.cnf
[mysqld]
选项=值
:wq
# systemctl restart mysqld

2.1 写在 master 数据库服务器配置文件里的参数(对"所有"slave服务器生效)

# vim /etc/my.cnf 只能写一个,要么值同步哪些库,要么忽略哪些库
binlog_do_db=db1, db2, db3 同步的库。不同库之间要用, 去隔开(逗号, 加空格)
binlog_ignore_db=db9 不同步的库

# systemctl restart mysqld
# mysql -uroot -p123qqq...A
mysql> show master status;
------------------------------------------------------------------------------
2.2 写在 slave 数据库服务器配置文件里的参数("只对本机"slave服务器生效)

replicate_do_db=db2 同步的库。不同库之间要用, 去隔开(逗号, 加空格)
replicate_ignore_db=studb 不同步的库

# systemctl restart mysqld
# mysql -uroot -p123qqq...A
mysql> show master status\G;
###############################################################################################
# vim /etc/my.cnf
binlog_ignore_db=db9 不同步db9,只同步其他库

# systemctl restart mysqld
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000002 | 154 | | db9 | | 可以看到Binlog_Ignore_DB对应的库是db9
+-----------------+----------+--------------+------------------+-------------------+
################################################################################################
# vim /etc/my.cnf
[mysqld]
binlog_do_db=db1, db2
... ...

# systemctl restart mysqld


mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000003 | 154 | db1, db2 | | |
+-----------------+----------+--------------+------------------+-------------------+
###################################################################################################
# vim /etc/my.cnf
[root@mysql51 ~]# systemctl restart mysqld

# mysql -uroot -p123qqq...A
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000004 | 154 | | | |
+-----------------+----------+--------------+------------------+-------------------+

####################################################################################
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000001 | 3192 | | | |
+-----------------+----------+--------------+------------------+-------------------+

 

binlog_do_db=db1, db2, db3

 

 

#############################################################################
52操作:

[mysqld]
replicate_do_db=db2 只同步db2库
#replicate_ignore_db=studb 这个如果写了要注销,要么同步某些库,要么忽略某些库。


mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000004
Read_Master_Log_Pos: 154
Relay_Log_File: mysql52-relay-bin.000011
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: db2 只同步db2库
###############################################################################################
三、主从同步模式(理论部分):

3.1 结构模式
一主一从
一主多从
主从从
主主结构(互为主从) 缺点:不能同时被访问。如果同时访问某个表,想要同时写的话,就会有写锁。在高可用集群采用,只和第三方软件使用,平时不单独用。

3.2 复制模式


51操作:
# mysqldump -uroot -p123qqq...A db1 > /root/db1.sql
出现这个提示正常
mysqldump: [Warning] Using a password on the command line interface can be insecure.

# scp /root/db1.sql 192.168.4.53:/root/

53操作:
第二种方法导入文件,先确保和51的数据一致! (今天不用第一种方法:# mysql -uroot -p123qqq...A db1 < /root/db1.sql)

mysql> create database db1; 导入文件前要先确保库要存在,需要我们自己创建
mysql> use db1;

mysql> show tables; 此刻查询到是空的
Empty set (0.00 sec)

mysql> source /root/db1.sql 这是新命令
mysql> show tables; 此刻能查询到了,成功导入表a
+---------------+
| Tables_in_db1 |
+---------------+
| a |
+---------------+

mysql> select * from a; 表a里也有内容

mysql> select * from db1.a where id=777;
+------+
| id |
+------+
| 777 |
| 777 |
| 777 |
+------+


mysql> quit


# mysql -h192.168.4.51 -urepluser -p123qqq...A 之前51主库授权的时候,是*.* ,所以它也可以连接51的数据库
######################################################################################################
一主多从(51为主,新设置53为从。52之前已经设置为从了)

51操作:

mysql> show master status; 先看主库的日志文件和偏移量,等一下配置从库时要用到。
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000004 | 154 | | | | 当前的日志文件是master51.000004,偏移量154
+-----------------+----------+--------------+------------------+-------------------+


53操作:
# vim /etc/my.cnf
[mysqld]
server_id=53 写id值为本机IP的主机号53
... ...

# systemctl restart mysqld
# mysql -uroot -p123qqq...A

mysql> show slave status; 现在还没配置从库,所以查不到从库信息
Empty set (0.00 sec)

mysql> change master to
-> master_host="192.168.4.51",
-> master_user="repluser",
-> master_password="123qqq...A",
-> master_log_file="master51.000004", 这里要写刚才在主库51上查询到的,日志文件名
-> master_log_pos=154; 这里要写刚才在主库51上查询到的,偏移量

mysql> start slave; 启动从库
mysql> show slave status\G; 查询从库信息 (如果看到IO和SQL线程都是yes,就证明成功了!)

页面显示如下:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000004
Read_Master_Log_Pos: 154
Relay_Log_File: mysql53-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000004
Slave_IO_Running: Yes IO线程为yes,说明成功!
Slave_SQL_Running: Yes SQL线程为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: 154
Relay_Log_Space: 528
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: 51
Master_UUID: aa60dede-ee00-11e8-b86d-5254005802fb
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:

##################################################################################
常见错误:
之前53设置过从库,有了从库的4个文件。然后现在又设置成新的从库。就会报错!
终极操作:删掉那4个从库的文件,然后重新配置!

先停止mysqld
删掉4个从库的文件,成为独立的库
然后再写配置/etc/my.cnf,指定id
然后重启mysqld
用root身份登陆数据库
然后重新配置
----------------------------------------------------------------------
从库上,如果指定的日志文件名写错了

先stop slave
然后重新指向对的文件,只要改对应部分就行(如果指定主的命令还没写完,只要还没启动,继续补充没有指定完的部分就行了)

比如:
mysql> change master to
... ...
-> master_log_file=" master51.000004"; 比如之前指定时,指定的文件名里多了一个空格,只要把它改为正确的文件名就行了。
... ...

现在追加命令
mysql> change master to master_log_file="master51.000004"; 只要把它改为正确的文件名就行了。

再start slave
然后就OK了
---------------------------------------------------------------------------------------------------
从库上,如果指定主的命令还没写完就回车了 (只要还没启动从库 start slave,继续补充没有指定完的部分就行了)

比如:
mysql> change master to
-> master_host="192.168.4.51",
-> master_user="repluser",
-> master_password="123qqq...A",
-> master_log_file="master51.000004";

忘记指定偏移量了,只要还没有start slave,就继续补充偏移量就行了
mysql> change master to
-> master_log_pos=154;

再start slave
然后就OK了
###################################################################################
客户端插入新的数据

50操作:

# mysql -h192.168.4.51 -uyaya100 -p123qqq...A

mysql> show grants;
+--------------------------------------------------+
| Grants for yaya100@% |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO 'yaya100'@'%' |
| GRANT SELECT, INSERT ON `db1`.* TO 'yaya100'@'%' |
+--------------------------------------------------+

mysql> insert into db1.a values(1111);
mysql> insert into db1.a values(1111);
mysql> select * from db1.a where id=1111;
+------+
| id |
+------+
| 1111 |
| 1111 |
+------+
---------------------------------------------------------------------------------------------------------------------
53从库 可以查询到同步的新数据

mysql> select * from db1.a where id=1111;
+------+
| id |
+------+
| 1111 |
| 1111 |
+------+
-----------------------------------------------------------------------------------------------------------------
51主库 可以查询到同步的新数据

mysql> select * from db1.a where id=1111;
+------+
| id |
+------+
| 1111 |
| 1111 |
+------+
----------------------------------------------------------------------------------------
52从库 查询不到新数据

mysql> select * from db1.a where id=1111;
Empty set (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000004
Read_Master_Log_Pos: 154
Relay_Log_File: mysql52-relay-bin.000011
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: db2 因为它只同步db2的数据
... ...
#########################################################################################
把53主机恢复成独立的数据库服务器

53操作:

# cd /var/lib/mysql
[root@mysql53 mysql]# rm -rf master.info
[root@mysql53 mysql]# rm -rf mysql53-relay-bin.*
[root@mysql53 mysql]# rm -rf relay-log.info
# systemctl restart mysqld
[root@mysql53 mysql]# mysql -uroot -p123qqq...A -e "show master status\G" | grep -i yes
mysql: [Warning] Using a password on the command line interface can be insecure.
##########################################################################################
主从从 51(master) 52(slave master) 53(slave)

52操作:(做主库也做从库的52,一定要记住,开启允许链式复制这个功能!)

# vim /etc/my.cnf

[mysqld]
log_slave_updates 写这行的作用是: 记录从库更新,允许链式复制!如果不写这行,当51发生数据更新,52作为51的从库能查到,但53作为52的从库就查不到了!
log_bin=master52 写这行
server_id=52 写这行
binlog_format="mixed" 写这行
replicate_do_db=db2
#replicate_ignore_db=studb

# systemctl restart mysqld
# mysql -uroot -p123qqq...A

mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A"; 授权从库

mysql> show master status; 查看主库信息
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master52.000001 | 154 | | | | 本机做主库日志文件是master52.000001,偏移量154
+-----------------+----------+--------------+------------------+-------------------+

mysql> reset master; 如果主库日志文件名是000005之类的,不是从1开始,如果想改成1的话,可以重置!就会变成1开始了。

mysql> show slave status\G; 查看从库信息,IO和SQL都是yes,成功了!

页面显示如下:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000004
Read_Master_Log_Pos: 692
Relay_Log_File: mysql52-relay-bin.000013
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000004
Slave_IO_Running: Yes IO是yes,成功!
Slave_SQL_Running: Yes SQL是yes,成功!
Replicate_Do_DB: db2
... ...
############################################################################################################
3 把主机53配置为52的从库


52操作:
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master52.000001 | 441 | | | | 当前的日志文件名和偏移量,之后53指向主库时要用到
+-----------------+----------+--------------+------------------+-------------------+

 

53操作:
# mysql -h192.168.4.51 -urepluser -p123qqq...A

mysql> show grants;
+--------------------------------------------------+
| Grants for repluser@% |
+--------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%' |
+--------------------------------------------------+


mysql> change master to
-> master_host="192.168.4.52",
-> master_user="repluser",
-> master_password="123qqq...A",
-> master_log_file="master52.000001", 主库指向52的日志文件
-> master_log_pos=441; 偏移量要写52查到的数字

mysql> start slave;

mysql> show slave status\G; 查看从库信息,IO和SQL都是yes,成功了!

页面显示如下:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.52
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master52.000001
Read_Master_Log_Pos: 441
Relay_Log_File: mysql53-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master52.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
... ...
#####################################################################################
3.2 mysql主从同步复制模式

异步: 主库不关心从库是否同步更新了。响应客户端的速度快。
全同步: 主库等所有从库都同步更新了,才响应客户端,速度慢。工作中不要用这个。
半同步: 主库等一个从库同步更新了,就响应客户端。工作中常用这个!(master slave


半同步复制模式
(master slave)

命令行模式,马上生效
写入配置文件,永久生效

51操作:

查看数据库是否认允许动态加载模块 (数据库一般都默认允许)
mysql> show variables like "have_dynamic_loading";
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES | yes代表允许
+----------------------+-------+


查看是否已经安装了模块
mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like "%semi%";
Empty set (0.00 sec) 可以看到目前模块为空


启用功能模块 (模块通常以.so结尾)
mysql> install plugin rpl_semi_sync_master soname "semisync_master.so";
mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like "%semi%";
+----------------------+---------------+
| plugin_name | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE | 已经加载master主模块了,状态为acitve活跃
+----------------------+---------------+


mysql> install plugin rpl_semi_sync_slave soname "semisync_slave.so"; 把主master改为从slave
mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like "%semi%";
+----------------------+---------------+
| plugin_name | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
| rpl_semi_sync_slave | ACTIVE |
+----------------------+---------------+


查看功能状态
mysql> show variables like "rpl_semi_sync_%enabled";
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | OFF | 主当前为off
| rpl_semi_sync_slave_enabled | OFF |
+------------------------------+-------+


mysql> set global rpl_semi_sync_master_enabled = 1;
mysql> set global rpl_semi_sync_slave_enabled = 1;

mysql> show variables like "rpl_semi_sync_%enabled";
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_slave_enabled | ON |
+------------------------------+-------+
########################################################################################################
写到配置文件,让设置永久生效

[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" 安装加载的意思
rpl_semi_sync_master_enabled=1 启用主
rpl_semi_sync_slave_enabled=1 启用从

# systemctl restart mysqld
# mysql -uroot -p123qqq...A

mysql> show variables like "rpl_semi_sync%enabled";
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_slave_enabled | ON |
+------------------------------+-------+

52也要配置,可以从51复制粘贴给52

[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" 写这行
rpl_semi_sync_master_enabled=1 写这行
rpl_semi_sync_slave_enabled=1 写这行
log_slave_updates
#replicate_do_db=db2
#replicate_ignore_db=studb
log_bin=master52
server_id=52
binlog_format="mixed"
... ...

# systemctl restart mysqld
# mysql -uroot -p123qqq...A

mysql> show variables like "rpl_semi_sync%enabled";
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_slave_enabled | ON |
+------------------------------+-------+


mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000006
Read_Master_Log_Pos: 154
Relay_Log_File: mysql52-relay-bin.000028
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000006
Slave_IO_Running: Yes IO是yes,成功!
Slave_SQL_Running: Yes SQL是yes,成功!
... ...
#####################################################################################
54和55主主后,还原成独立服务器
53还原成独立服务器
50客户端,51,52不变,57读写分离(只要把之前做的lamp服务关掉即可)
#####################################################################################
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" 写这行
rpl_semi_sync_master_enabled=1 写这行
rpl_semi_sync_slave_
enabled 激活

 

posted @ 2019-04-30 22:34  安于夏  阅读(370)  评论(0编辑  收藏  举报