mysql主从同步配置经验

来源:互联网 发布:淘宝账期保障类目 编辑:程序博客网 时间:2024/06/01 23:45

因为工作需要,公司要建一个数据库主从,很荣幸,这件事就落在了我头上。
作为一个对LINUX命令不熟,连安装MYSQL都只会按步骤来,出了错就一脸懵逼的程序员来,这将是一件很有挑战的事情。
万幸,在经过两天的不懈努力之后,终于完成了。
接下来,我将自己配置的过程和遇到的问题分享出来,希望能帮到同需配主从的朋友。

配置过程中遇到的错误会在结尾附上相应的解决方案。

配置过程中所有的名字和文件名我都按自己的理解的解释,可能不专业,甚至错误,希望能指出与谅解。

准备工作:
服务器两台:
分别是
master(主服务器IP:21)
slave(从服务器IP:23)
安装好mysql(讲真,大半时间浪费这里,安装MYSQL各种各样的问题出现)。
保持两服务器数据库之前表结构一至。



1.在21(master)下,给指定机器创slave用户

mysql> GRANT REPLICATION SLAVE ON *.* to 'slaveUser'@'ip' identified by 'password';

这一步是指给slave赋于可以登录、同步的用户。
IP为slave端的IP。



2.在21(master)下,查看master状态

mysql> show master status;

这里写图片描述
File:主库的日志文件
Position:日志文件标注的当前位置
Binlog_Do_DB:需要同步的库
Binlog_Ignore_DB:忽略同步的库
Executed_Gtid_Set:–

这一步是查看主服务是否配置了记录binlog,如果出现empty set,你需要在配置文件里加入log-bin,slave也要在配置加上。(参照结尾:E-1)



3.在23(slave)下,设置mysql配置文件中的server-id
server-id = 20

server-id:暂时没明白,应该是slave端向master请求的一个唯一标识,此值避免与其他的slave一样,否则将会失败。



4.在21(master)下,停止对界对数据库的操作

mysql> FLUSH TABLES WITH READ LOCK;



5.将主库原来有的数据移至从库
将主服务器的数据文件(安装mysql时设置的data目录下)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压。
如果你配置的指定库,那么只复制指定文件了。



6.在21下,查看master的值

mysql> show master status;

这里写图片描述

在这里查看时,position值与上次查看不一样了,这是因为在我们操作的过程中,有人操作了数据,所以这个值被改变,而执行同步时,这个值是不能变的。


7.在23(slave)下,设置slave的参数
记录File与Position的值。

mysql> change master tomaster_host='21',master_user='slaveUser',master_password='password',master_log_file='mysql-bin.000001',master_port=3306,master_log_pos=980;

master_host:主服务器的IP
master_user:在第一步设置的用户名
master_password:在第一步设置的密码
master_log_file:日志文件,主服务器中的show master status时的File值
master_log_pos:日志位置,主服务器中的show master status时的Position值
master_port:主服务对外端口


8.在23(slave)下,启动slave

mysql> start slave;

查看slave状态:

mysql> show slave status\G

***************** 1. row *****************
Slave_IO_State: Waiting for master to send event
Master_Host: 21
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 980
Relay_Log_File: rzserv-relay-bin.000003
Relay_Log_Pos: 286
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: zyr
Replicate_Ignore_DB: test,mysql,performance_schema,information_schema
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table: zyr.t_user
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 810
Relay_Log_Space: 460
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: 10
Master_UUID: 86d76e97-66e2-11e7-9d9b-000c290bca56
Master_Info_File: /usr/local/mysql-5.6.31/data3306/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
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
1 row in set (0.00 sec)

状态中,
Slave_IO_Running
Slave_SQL_Running
这两个状态都为Yes时,才算成功,如果出现
Slave_IO_Running:connecting
Slave_SQL_Running:No
任意一种,是失败的,解决方案参照E-2



9.在21(master)下,放开主库锁定

mysql> unlock tables;

到此,主从配置成功完成,接下来就是去数据库里验证了。

以下是主从配置时,如果需要指定库和表同步,可以在master端或是slave中mysql数据库配置文件(my.cnf)中设置:
master端:
二进制需要同步的库
binlog-do-db=test
binlog-do-db=test2
不需要同步的库
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema

slave端:
要复制的数据库
replicate-do-db=dbName
不复制的数据库
replicate-ignore-db=mysql
replicate-ignore-db=performance_schema
replicate-ignore-db=information_schema
要复制的表
replicate-wild-do-table=db.table1
replicate-wild-do-table=db.table2
不复制的表
replicate-wild-ignore-table=db.table1
replicate-wild-ignore-table=db.table2

可以使用通配符:%
如:
db中,同步所有t_开头的表
replicate-wild-ignore-table=db.t_%

在上述我显示出来slave状态中可以看到,我只同步了zyr库中的t_user表。
不同步test,mysql,performance_schema,information_schema

设置的时候,请务必将mysql这个库设置不同步,以免引起不必要的麻烦。



E-1:
mysql> show master status;
出现empty set,怎么办?
在配置文件中,加入
log-bin=mysql-bin
这一行
附:如何查看mysql配置文件?



E-2:
不管哪种错误,先停止同步:

mysql> slave stop;

Slave_IO_Running:connecting
这是指连接中,一般都是slave端change master to时,参数错误了,需要仔细对照,或是直接重新设置第6步,保证参数正确。

Slave_SQL_Running:No
一般是事务回滚,或是有人操作了slave端要同步的数据库

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 

以上,就是在配置过程中遇到的问题和解决的方法,如果发现别的问题,欢迎交流学习。

原创粉丝点击