16boke - 一路博客

MySql数据库双机备份

建立两个数据库,一个为主一个为次,在数据库层面实现同步。

明白什么时候同步,怎么配置。程序中怎么实现读写分离?从主库写,从备份库读?

BaseDao类封装数据库访问类,在这个类中区别读写,可以打开两个数据源,写操作针对主数据源对应的库来操作,读操作针对从数据库来操作。


开始配置:

主服务器IP:1.1.1.88【centos系统的mysql】

从服务器IP:1.1.1.199【windows系统的mysql】


1、修改主服务器的mysql配置文件:(默认linux下为:my.cnf,Windows下为:my.ini)


注意:修改的时候注意先修改my.ini的权限,改成完全控制,不然无法保存。


打开my.cnf,在[mysqld]下面添加如下内容:


server-id=88                 #[必须]服务器唯一ID,默认是1,一般取IP最后一段


log-bin=mysql-bin01      #[必须]启用二进制日志


replicate-do-db=radius    #这里设置需要在主服务器记录日志的数据库,只有在这里设置了的数据库才能被复制到从服务器


binlog-do-db=DB2            #如果备份多个数据库,重复设置这个选项即可

binlog-do-db=DB3          #需要同步的数据库,如果没有本行,即表示同步所有的数据库

binlog-ignore-db=mysql  #被忽略的数据库


2、进入主服务器的mysql控制台,执行 show master status;



3、执行 SHOW VARIABLES LIKE "%log_bin%";  查看主服务器的binlog是否开启。 log_bin 这项 为 ON 的话就表示已开启。



4、在主服务器上创建从服务器使用的帐号并给予相应的权限(主要是replication slave权限),为避免配置过程中出现问题,可以也给予 reload,super权限,配好后再跟据实际情况取消。


grant replication slave, reload, super on *.* to 'backup'@'1.1.1.199' identified by '123456'; #backup是用户名,123456是密码


5、至此主服务器已设置完成


6、接下来打开从服务器的mysql配置文件。在[mysqld]节点下,添加或修改成。


注意:同样保证可写权限


server-id=199


log-bin=mysql-bin01


replicate-do-db=radius


7、打开从服务器的mysql控制台,使用命令设置。


change master to
master_host='1.1.1.88',
master_user='backup',
master_password='123456',
master_log_file='mysql-bin01.000001',  #此处填写主服务器的日志文件名,文章上方主服务状态信息中的File的值,上面已用红色强调。
master_log_pos=4887; #此处填写主服务器日志文件记录的位置,文章上方主服务状态信息中的Position的值,上面已用红色强调。


8、执行上面命令后,再执行start slave,用启动从服务器模式。


9、检查从服务器复制功能:


输入:show slave status\G;


*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 1.1.1.88                    //主服务器地址

Master_User: root                         //授权帐户名,尽量避免使用root

Master_Port: 3306                        //数据库端口,部分版本没有此行

Connect_Retry: 60

Master_Log_File: mysql-bin01.000002

Read_Master_Log_Pos: 838

Relay_Log_File: admin-PC-relay-bin.000002

Relay_Log_Pos: 999

Relay_Master_Log_File: mysql-bin01.000002

Slave_IO_Running: Yes                            //此状态必须YES

Slave_SQL_Running: Yes                          //此状态必须YES

注:Slave_IOSlave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)

Replicate_Do_DB: radius

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: 838

Relay_Log_Space: 1171

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: 88

Master_UUID:

Master_Info_File: C:\Program Files (x86)\MySQL\MySQL Server 5.6\data\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)

                                                                                      

10、可以使用 show processlist 查看进程,进程状态如和下方红色内容一样的话,说明从服务器运行正常,已经连接上主服务器,开始接受并执行日志




11、然后最好重启一下从服务器的MySQL。


12、在从服务器的MySQL控制台,使用show slave status; 命令,查看从服务器的运行状态。显示结果中以下两项都为Yes的话,那说明正常。


  1. Slave_IO_Running: Yes  

  2. Slave_SQL_Running: Yes


13、在主服务器上Test数据库创建表,写入数据,然后到从服务器上查看Test数据库有没有进行同步。


如何解决主从服务器数据不同步造成?
造成主从服务器不同步的原因主要是:在从服务器上做了更新操作。所以为了避免这种不同步的情况可以采用在从服务器上建立一个只读的用户,所有开发人员都只能使用只读的这个用户来查询从服务器。而在主服务器上配置为可写的用户,这个可写的用户只用来做主从复制操作。如果出现主从不同步的情况该如何解决呢?
这时可以通过以下几步来处理:
在从服务器上使用命令stop slave停止从服务器。
在主服务器上使用命令flush logs 刷新主服务器日志信息。
在主服务器上使用命令show master status ;查看主服务器状态,主要关注日志文件名称和位置偏移量(position)。
在从服务器上执行命令change master to master_log_file='mysql-bin.00004',master_log_pos=397;注意文件名和position和主服务器上对应。
使用命令start slave;启动从服务器的slave线程。
再次在主服务器表中插入数据,就应该能够正常同步了。


MySql