• mysql主从复制


    mysql主从复制的原理
      Master,记录数据更改操作
        启用binlog记录模式
        允许Slave读取binlog日志
      Slave运行两个同步线程
        Slave_IO:负责连接Master,复制其binlog日志文件到本机的relay-log文件
        Slave_SQL:负责执行本机relay-log文件里的SQL语句,重现Master的数据操作

    基本构建思路
      初始化现有库
        将主库倒入重库,确保数据一致性
      配置Master,主服务器
        调整运行参数,授权一个同步用户
      配置Slave,从服务器
        调整运行参数,发起同步操作
    一:初始化现有库
    1)备份MySQL Master上现有的库,如果服务器已经启用binlog,建议对日志做一次重置,否则可忽略:

    [root@master ~]# mysql -u root -p
    Enter password:                                  //以数据库用户root登入
    .. ..
    mysql> RESET MASTER;                              //重置binlog日志
    Query OK, 0 rows affected (0.07 sec)
    mysql> quit                                      //退出mysql> 环境
    Bye

    以备份mysql库、test库为例,导出操作如下:

    [root@master ~]# mysqldump -u root -p -B mysql test > /root/mytest.sql
    Enter password:                                      //验证口令
    [root@dbsvr1 ~]# ls -lh /root/mytest.sql              //确认备份结果
    -rw-r--r--. 1 root root 457K 1月  18 11:50 /root/mytest.sql

    2)在MySQL Slave上导入备份的库

    先清理目标库,避免导入时冲突。主要是采用InnoDB引擎的库,授权库mysql多采用MyISAM引擎,可不做清理。

    [root@slave ~]# mysql -u root -p
    Enter password:                                  //以数据库用户root登入
    .. ..
    mysql> DROP DATABASE test;                          //删除test库
    Query OK, 0 rows affected (0.03 sec)
    mysql> quit                                      //退出mysql> 环境
    Bye

    使用scp工具下载备份文件:

    [root@slave ~]# scp dbsvr1:/root/mytest.sql ./
    root@dbsvr1's password:                          //验证对方系统用户root的口令
    mytest.sql                                    100%  577KB 576.6KB/s   00:01
    [root@dbsvr2 ~]# ls -lh mytest.sql              //确认下载结果
    -rw-r--r--. 1 root root 457K 1月  16 12:00 mytest.sql

    执行导入操作:

    [root@slave ~]# mysql -u root -p < mytest.sql
    Enter password: 

    二:配置MySQL Master
    1)修改/etc/my.cnf配置,重新启动MySQL服务程序,指定服务器ID号、允许日志同步:

    [root@master mysql]# vim /etc/my.cnf
    [mysqld]
    log_bin=dbsvr1-bin                      //启用binlog日志,并指定文件名前缀
    server_id = 10                          //指定服务器ID号
    innodb_flush_log_at_trx_commit=1      //优化设置
    sync-binlog=1                          //允许日志同步
    #binlog-do-db=YYY //需要同步的数据库,不在内的不同步。(不添加这行表示同步所有)
    binlog-do-db=test1,test2  //这里主库只同步test1,test2库。
    #binlog-ignore-db = test1,test2  //这里向从库同步时忽略test1,test2库
    .. ..
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    explicit_defaults_for_timestamp=1
    
    [root@master ~]# service mysqld restart

    2)新建一个备份用户,授予复制权限
    需要的权限为REPLICATION SLAVE,允许其从Slave服务器访问:

    REPLICATION SLAVE 常用于建立复制时所需要用到的用户权限,也就是slave server必须被master server授权具有该权限的用户,才能通过该用户复制。
    并且"SHOW SLAVE HOSTS"这条命令和REPLICATION SLAVE权限有关,否则执行时会报错:

    REPLICATION CLIENT 不可用于建立复制,有该权限时,只是多了可以使用如"SHOW SLAVE STATUS"、"SHOW MASTER STATUS"等命令。
    在5.6.6版本以后,也可以使用"SHOW BINARY LOGS"。

    mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicater'@'192.168.10.%' IDENTIFIED BY 'pwd123';
    Query OK, 0 rows affected (0.03 sec)

    3)检查Master服务器的同步状态
    在已经初始化现有库的情况下,查看MASTER状态,记录下当前的日志文件名、偏移的位置(下面SLAVE发起复制时需要用到):

    mysql> SHOW MASTER STATUSG
    *************************** 1. row ***************************
                 File: dbsvr1-bin.000002              //记住当前的日志文件名
             Position: 334                          //记住当前的位置
         Binlog_Do_DB:
     Binlog_Ignore_DB:
    Executed_Gtid_Set:
    1 row in set (0.03 sec)

    三:配置MySQL Slave(从服务器)

    1)修改/etc/my.cnf配置,重新启动MySQL服务程序
    指定服务器ID号、允许日志同步:

    [root@slave ~]# vim /etc/my.cnf
    [mysqld]
    log_bin=dbsvr2-bin                      //启动SQL日志,并指定文件名前缀
    server_id = 20                          //指定服务器ID号,不要与Master的相同
    innodb_flush_log_at_trx_commit=1      //优化设置
    sync-binlog=1                          //允许日志同步
    log_slave_updates=1                  //记录从库更新,便于实现“主-从-从”链式复制
    #replicate-do-db    //设定需要复制的数据库(多数据库使用逗号,隔开)
    #replicate-ignore-db //设定需要忽略的复制数据库 (多数据库使用逗号,隔开)
    #replicate-do-table=XXX.XX  //设定需要复制的表
    #replicate-ignore-table //设定需要忽略的复制表 
    #replicate-wild-do-table //同replication-do-table功能一样,但是可以通配符
    #replicate-wild-ignore-table //同replication-ignore-table功能一样,但是可以加通配符
    
    .. ..
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    explicit_defaults_for_timestamp=1

    增加通配符的两个配置

    replicate-wild-do-table=db_name.%   //只复制哪个库的哪个表
    replicate-wild-ignore-table=mysql.%   //忽略哪个库的哪个表

    在生产环境中,还可以根据需要设置更详细的同步选项。比如,指定当主、从网络中断时的重试超时时间(slave-net-timeout=60 )等,具体可参考MySQL手册。
    配置完成后,重启mysql服务:

    2)登入 mysql> 环境,发起同步操作
    通过CHANGE MASTER语句指定MASTER服务器的IP地址、同步用户名/密码、起始日志文件、偏移位置(参考MASTER上的状态输出):

    mysql> CHANGE MASTER TO MASTER_HOST='192.168.10.10',
        -> MASTER_USER='replicater',
        -> MASTER_PASSWORD='pwd123',
        -> MASTER_LOG_FILE='dbsvr1-bin.000002',      //对应Master的日志文件
        -> MASTER_LOG_POS=334,                          //对应Master的日志偏移位置
        -> MASTER_PORT=3306;
    Query OK, 0 rows affected, 2 warnings (0.12 sec)

    然后执行START SLAVE(较早版本中为SLAVE START)启动复制:

    mysql> START SLAVE;                              //启动复制
    Query OK, 0 rows affected (0.04 sec

    注意:一旦启用SLAVE复制,当需要修改MASTER信息时,应先执行STOP SLAVE停止复制,然后重新修改、启动复制。
    通过上述连接操作,MASTER服务器的设置信息自动存为master.info文件,以后每次MySQL服务程序时会自动调用并更新,无需重复设置。查看master.info文件的开头部分内容,可验证相关设置:

    3)检查Slave服务器的同步状态
    通过SHOW SLAVE STATUS语句可查看从服务器状态,确认其中的IO线程、SQL线程正常运行,才能成功同步:

    mysql> SHOW SLAVE STATUSG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.4.10
                      Master_User: replicater
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: dbsvr1-bin.000002
              Read_Master_Log_Pos: 334
                   Relay_Log_File: dbsvr2-relay-bin.000002
                    Relay_Log_Pos: 284
            Relay_Master_Log_File: dbsvr1-bin.000002
                 Slave_IO_Running: Yes              //IO线程应该已运行
                Slave_SQL_Running: Yes              //SQL线程应该已运行
                ..........
                .........

    若START SLAVE直接报错失败,请检查CHANGE MASTER相关设置是否有误,纠正后再重试;若IO线程或SQL线程有一个为“No”,则应检查服务器的错误日志,分析并排除故障后重启主从复制。

    四:测试主从同步效果
    1)在Master上操作数据库、表、表记录
    新建newdb库、newtable表,随意插入几条表记录,然后在slave上查看是否同步到相应的数据
    ........
    .........

    五:将Slave服务器设为只读

    一般来说,为了避免写入冲突,采用主、从复制结构时,不应该允许用户从Slave执行数据库写入操作,这样会导致双方数据的不一致性。
    正因为如此,我们可以把Slave数据库限制为只读模式,这种情况下有SUPER权限的用户和SLAVE同步线程才能写入。相关验证操作及效果可参考以下过程。
    1)修改/etc/my.cnf文件,重载配置

    [root@slave ~]# vim /etc/my.cnf
    [mysqld]
    .. ..
    read_only=1                                      //启动只读模式
    [root@slave ~]# service mysqld restart          //重启服务
    Shutting down MySQL..                                 [确定]
    Starting MySQL...                                     [确定]
  • 相关阅读:
    DataGrid
    取整、取小数点位数
    如何跨浏览器使用连续字符的换行
    如何给 legend 标签设定宽度
    25个简洁优美的网站设计
    重新发现HTML表格
    用户研究角度看设计(2):用户为何视若无睹
    lineheight 属性的继承问题
    jQuery技巧总结
    web2.0网站配色方案
  • 原文地址:https://www.cnblogs.com/linyouyi/p/9823529.html
Copyright © 2020-2023  润新知