Mysql_主从复制
1、在做主从复制之前,要保证主数据库与从数据库配置一样,如数据库的版本
2、修改主服务器master配置文件my.cnf:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=123 //[必须]服务器唯一ID
3、修改从服务器slave的配置文件my.cnf:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[不是必须]启用二进制日志
server-id=234 //[必须]服务器唯一ID
4、重启两台服务器的mysql数据库
systemctl restart mysqld
5、在主数据库上建立帐户并授权slave:
#/usr/local/mysql/bin/mysql -uroot -pmttang
mysql>GRANT REPLICATION SLAVE ON *.* to 'test'@'%' identified by 'q123456'; //一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。
查看主服务器的二进制日志的名称
通过使用命令行客户端连接到主服务器来启动主服务器上的会话,并通过执行以下
FLUSH TABLES WITH READ LOCK;
语句来刷新所有表和阻止写语句:
mysql> FLUSH TABLES WITH READ LOCK;
https://dev.mysql.com/doc/refman/5.7/en/flush.html#flush-tables-with-read-lock
FLUSH [NO_WRITE_TO_BINLOG | LOCAL] { flush_option [, flush_option] ... | tables_option } flush_option: { BINARY LOGS | DES_KEY_FILE | ENGINE LOGS | ERROR LOGS | GENERAL LOGS | HOSTS | LOGS | PRIVILEGES | OPTIMIZER_COSTS | QUERY CACHE | RELAY LOGS [FOR CHANNEL channel] | SLOW LOGS | STATUS | USER_RESOURCES } tables_option: { TABLES | TABLES tbl_name [, tbl_name] ... | TABLES WITH READ LOCK | TABLES tbl_name [, tbl_name] ... WITH READ LOCK | TABLES tbl_name [, tbl_name] ... FOR EXPORT }
6、登录主服务器的mysql,查询master的状态
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 308 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
7、配置从服务器Slave:
mysql>change master to master_host='192.168.145.123,master_user='test',master_password='q123456',
master_log_file='mysql-bin.000004',master_log_pos=308; //注意不要断开,308数字前后无单引号。
Mysql>start slave; //启动从服务器复制功能
8、检查从服务器复制功能状态:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.222 //主服务器地址
Master_User: mysync //授权帐户名,尽量避免使用root
Master_Port: 3306 //数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600 //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes //此状态必须YES
Slave_SQL_Running: Yes //此状态必须YES
......
以上操作过程,主从服务器配置完成。
Slave_IO_Running:yes
Slave_SQL_Running:yes
这两个线程前面有提到,是slave上参与复制过程中两个很重要的线程。YES表示正常,NO表示异常。
Slave_IO线程主要是将master上的binlong日志内容复制到slave的中继日志中(Relay_log),一般出现问题的概率不大, 出现问题大多数是因为权限或者网络等问题,导致连接不上master。如同前面提到的那个错误。
Slave_SQL线程负责将中继日志中的SQL执行一遍,相对来说出错的概率大些。如有人手动的在从库中插入一些记录,导致主从同步的时候出现主键冲突。
Slave_IO_STATE:Waiting for master to send event—这个状态表示中继日志同步完成,等待master有新的事件产生。