• mysql主从搭建


    Mysql主从搭建

    MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展。多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能。

    实现思路

    实现MySQL主从复制需要进行的配置:
    
    主服务器:
    开启二进制日志
    配置唯一的server-id
    获得master二进制日志文件名及位置(Position)
    创建一个用于slave和master通信的用户账号
    
    从服务器:
    配置唯一的server-id
    使用master分配的用户账号读取master二进制日志(执行sql语句)
    启用slave服务
    

    一、准备工作

    1.主从数据库版本最好一致
    2.主从数据库内数据保持一致
    主数据库:192.168.1.52 /linux
    从数据库:192.168.1.190 /linux
    
    二、主数据库master修改
    1.修改mysql配置
    
    修改配置文件/etc/mysql/my.cnf,在[mysqld]部分插入如下两行:
    
    [mysqld]
    log-bin=mysql-bin #开启二进制日志
    server-id=1 #设置server-id
    
    2.重启mysql,创建用于同步的用户账号
    
    打开mysql会话shell>mysql -hlocalhost -uname -ppassword
    创建用户并授权:用户:repl密码:123123
    
    grant replication slave on *.* to 'repl'@'192.168.1.52' identified by '123123';
    #给用户repl赋予replication权限和ip密码
    flush privileges;               #重新刷新权限
    flush tables with read lock;    #表的读锁死
    show master status;             #读数据状态
    
    3.查看master状态
    
    记录二进制文件名(mysql-bin.000236)和位置(66014):
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000236 |    66014 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.02 sec)
    
    

    三、从服务器slave修改

    1.修改mysql配置
    同样修改my.cnf配置文件,添加server-id
    
    [mysqld]server-id=2 #设置server-id,必须唯一
    
    2.重启mysql,打开mysql会话,执行同步SQL语句
    (需要主服务器主机名,登陆凭据,二进制文件的名称和位置):
    
    mysql> CHANGE MASTER TO
        -> MASTER_HOST='192.168.1.52',
        -> MASTER_USER='repl',
        -> MASTER_PASSWORD='123123',
        -> MASTER_LOG_FILE='mysql-bin.000236',
        -> MASTER_LOG_POS=66014;
    Query OK, 0 rows affected, 2 warnings (0.07 sec)
    
    3.启动slave同步进程:
    
    mysql>start slave;
    
    4.查看slave状态:
    
    mysql> show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.1.52
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000236
              Read_Master_Log_Pos: 106039
                   Relay_Log_File: mysqld-relay-bin.000002
                    Relay_Log_Pos: 40308
            Relay_Master_Log_File: mysql-bin.000236
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    ...
    
    

    当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了。

    接下来就可以进行一些验证了。比如在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效;还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了。

    其他参数

    还可以用到的其他相关参数:
    master开启二进制日志后默认记录所有库所有表的操作,
    可以通过配置来指定只记录指定的数据库甚至指定的表的操作,
    具体在mysql配置文件的[mysqld]可添加修改如下选项:
    
    # 不同步哪些数据库
    
    binlog-ignore-db = mysql
    binlog-ignore-db = test
    binlog-ignore-db = information_schema
    
    # 只同步哪些数据库,除此之外,其他不同步
    
    binlog-do-db = game  
    
    

    问题处理

    mysql> show slave statusG
            .......
                Relay_Log_File: localhost-relay-bin.000535
                Relay_Log_Pos: 21795072
                Relay_Master_Log_File: localhost-bin.000094
                Slave_IO_Running: Yes
                Slave_SQL_Running: No
                Replicate_Do_DB: 
                Replicate_Ignore_DB: 
          ......
    
    • 解决办法一
    Slave_SQL_Running: No
    1.程序可能在slave上进行了写操作
    2.也可能是slave机器重起后,事务回滚造成的.
    
    一般是事务回滚造成的:
    解决办法:
    
    mysql> slave stop;
    mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
    mysql> slave start;
    
    
    • 解决办法二
    首先停掉Slave服务:slave stop
    到主服务器上查看主机状态:
    记录File和Position对应的值
    进入master
    mysql> show master status;
    
    然后到slave服务器上执行手动同步:
    重新执行change master to语句
    
    

    也有可能跟我一样,没有执行锁表语句(表的读锁死)

    因为不会执行主从复制前的数据,需要自己手动复制(执行sql导入)

  • 相关阅读:
    宣布降低Windows Azure 存储和计算的价格
    物联网操作系统的概念和特点
    基于Windows8与Visual Studio11开发第一个内核驱动程序
    在 C++ 中使用 PPL 进行异步编程
    现实世界的Windows Azure:采访Figlo的全球合作伙伴支持经理Nathan Brouwer
    物联网操作系统随笔
    Windows Azure Toolkit for Windows 8 Consumer Preview的升级版发布了
    上海招聘会场所
    理解 Delphi 的类(十) 深入方法[3] 调用时参数分割
    关于类的入门例子(7): 遍历窗体的所有父类
  • 原文地址:https://www.cnblogs.com/irockcode/p/8435871.html
Copyright © 2020-2023  润新知