美文网首页
mysql的主从复制笔记

mysql的主从复制笔记

作者: rightchen | 来源:发表于2018-05-23 00:33 被阅读0次

    mysql主从复制

    在应用开发中,为了解决单台mysql服务器负载压力,将两台及更多台mysql服务器设置主从关系,并将数据通过mysql数据日志方式维护数据同步。其中主服务器(master server)作为增删改的服务器,并及时将数据同步到从服务器(slave server),从服务器作为查询服务器(select)。好处是从服务器作为查询服务器,分担主服务器的查询负载压力。同时从服务器也可作为数据备份。

    环境说明:centos6.5,主服务器mysql5.5,从服务器mysql6.6。主服务器10.0.0.21,从服务器10.0.0.11。需要保证服务器之间能够ping通,以及mysql防火墙正常访问。

    master的配置

    在linux系统中,编辑主服务器的mysql配置文件,例如文件所在/etc/my.cnf。配置在[mysqld]节点下,如示例:

    log-bin=mysql-bin

    server-id=1

    binlog-do-db=database1

    binlog-do-db=database2

    binlog-ignore-db=information_schema

    binlog-ignore-db=mysql

    expire_logs_days = 5

    max_binlog_size = 500M

    上面实例中,log-bin=mysql-bin则为开启mysql二进制日志记录;server-id可以取值,需要保证唯一性;binlog-do-db则是指定需要同步的数据库,多个数据库按照上面3、4行类似换行写入,不填写则代表同步全部数据库;binlog-ignore-db则是需要排除的指定数据库,不写则不排除,原理同binlog-do-db;expire_logs_days代表过期后的文件几天内删除;max_binlog_size代表单个日志文件的最大值,超过最大值生成新的日志文件;如果不设置最后两项,则日志文件无限量生长,数据量过大的话会占用服务器磁盘空间。

    :wq保存选项,重启数据库,service mysqld restart。

    接下来进入mysql命令行,创建用户并授权

    mysql>CREATE USER 'slaveuser'@'10.0.0.11' IDENTIFIED BY 'slavepass';

    mysql>GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'10.0.0.11';

    mysql>flush privileges; 

    查看主服务器信息

    mysql> show master status;

    +------------------+----------+-------------------+------------------+

    | File            | Position | Binlog_Do_DB      | Binlog_Ignore_DB |

    +------------------+----------+-------------------+------------------+

    | mysql-bin.000446 |  7659266 | adserver,copytest |                  |

    +------------------+----------+-------------------+------------------+

    1 row in set (0.00 sec)

    上面中,file字段表示当前主库的bin-log文件,position表示记录的行数。binlog-do-db表示当前所记录的数据库二进制文件,binlog-ignore-db表示当前排除记录的数据库,表格记录为空,表示没有任何指定排除的数据库。

    同步数据库

    #在主库导出数据库sql语句,保存在data目录下。

    mysqldump -uroot -ppassword  database  --skip-lock-tables>/data/database.sql

    #将database.sql拷贝到从服务器。执行mysql命令

    #创建database数据库

    CREATE DATABASE database CHARACTER SET utf8 COLLATE utf8_general_ci;

    use database;

    #使用source命令导入数据到database

    source /data/database.sql

    slave的配置

    配置从库的my.cnf文件,在[mysqld]节点下编辑如下内容。

    log-bin=mysql-bin

    server-id=2

    :wq保存退出。重启mysql服务:service mysqld restart。

    进入到mysql命令行模式,操作如下:

    mysql> stop slave;  #关闭Slave

    mysql>set global  sql_slave_skip_counter=1;    #跳过错误sql,保持同步进行

    mysql> change master to master_host='10.0.0.21',master_user='slaveuser',master_password='slavepass',master_log_file='mysql-bin.000446', master_log_pos=0;

    mysql> start slave;  #开启Slave

    在执行show slave status查看当前配置状态:

    当slave_io_running和slave_sql_running都为yes时,则表明当前处于正常同步状态。

    测试,可以在主库中增加一个测试表,增加或修改数据的同时,查看从库的数据。当数据一致时,则表明当前配置成功;

    配置完成后,经过测试。有如下总结:

    1、数据的实时同步很快的。几乎没有延迟。

    2、每次主服务器重启mysql服务后,都会使用新的binlog日志文件。slave在查看状态时,也会自动使用新的二进制文件进行监听数据。所以不用担心主服务器重启后,每次都要手动更新配置二进制文件。

    3、在配置的时候,例如my.cnf文件需要备份,防止修改出错后,及时调整回来。避免出现mysql因为长时间不能正常启动,尤其是在生产环境。

    4、如果在数据库导出的时候,数据在不断的增长,而mysql服务器友不能停,所以会出现主从服务器延迟带来的数据差异。为了防止导出过程中延迟带来的数据差异过大,可在导出数据库后,立刻重启master的mysql服务器。在show master status信息,导出数据到slave后,设置slave同步时,填写最新的二进制文件,日志文件起始行填写为0。可最大程度缩小数据差异。

    嗯……,困了,整理完毕。晚安😴

    ------------------------------------------------2018-11-20更新-----------------------------------------

    今天因为同事在主库跨库查询另外一个库得sql语句,造成结构更新事件同步执行到了从库,因为从库数据库群与主库数据库群不一致,导致从库更新失败。经过了解,重新布置了一次主从同步,在从库即将开始(start salve操作)前,设置跳过错误事件。如下:

    mysql> set global  sql_slave_skip_counter=1;    #跳过错误sql,保持数据库同步进行

    相关文章

      网友评论

          本文标题:mysql的主从复制笔记

          本文链接:https://www.haomeiwen.com/subject/mghljftx.html