• Mysql 主从设置


    一、准备服务器

    由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者更低,Master的版本肯定不能高于Slave版本。

    我测试设置成功的服务器:
    主服务器(以下简称Master)的版本是3.23.58,
    从服务器(以下简称Slave)的版本是5.0.91,这个跨度应该算比较大了吧。

    Master主机名为:A(IP:192.168.0.1),
    Slave  主机名为:B(IP:192.168.0.2),
    2个MySQL的basedir目录都是/usr/local/mysql,datadir都是:/var/lib/mysql/ 。
    默认安装的就如此。

    二、设置同步Master 服务器

    1、设置my.cnf

    # cp /usr/share/doc/mysql-server-3.23.58/my-large.cnf /etc/my.cnf
    对于my-large.cnf这个文件个人觉得只是mysql大型数据库配置的demo文件,copy该目录下的my-small.cnf应该是一样的;
    因为我服务器配置比较高,看large里面参数多,省事就选他用了。
    修改 my.cnf 文件:

    log-bin = mysql-bin        #指定生成binlog文件名
    server-id       = 1            #此id不可重复
    binlog-do-db = news        #需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可
    binlog-ignore-db = mysql  #不需要同步的数据库名,可以设定多条
    binlog-ignore-db = test     #不需要同步的数据库名,可以设定多条
    log-slave-updates            #这个参数一定要加上,否则不会给更新的记录些到二进制文件里
    slave-skip-errors            #是跳过错误,继续执行复制操作

    2、建立用户
    $mysql -u root -p    #进入mysql
    mysql>CREATE USER TO ‘backup'@'%' DENTIFIED BY ’backuppass’;   #创建备份用户backup
    mysql>GRANT FILE,SELECT,RELOAD ON *.* TO ‘backup'@'%';      #设置权限
    因为mysql版本太老了,所以不支持REPLICATION SLAVE,否则用下面的:
    mysql>GRANT FILE,SELECT,RELOAD,REPLICATION SLAVE ON *.* TO ‘backup'@'%';        #设置权限

    mysql>FLUSH PRIVILEGES ;

    3、在Replication完成前,Master跟Slave的数据内容必須一致,故在备份导出数据库前先Lock成只读。
    mysql > FLUSH TABLES WITH READ LOCK;

    4、需要同步的news数据库导出,可以使用mysqldump或者是tar的方式压缩起來。

    如果用mysqldump的方式:
    $mysqldump -u root -p news > news.sql       #导出数据库成文件news.sql

    因为2个数据版本不一样,且存储编码不一样,我用的上面的方法。

    如果用压缩方式:
    cd /var/lib/mysql/  #mysql库目录
    tar zcvf news.tar.gz news

    5、导出数据库后,解除只读:

    mysql>UNLOCK TABLES;

    6、 重启mysql,前面设置的my.cnf生效;重启后,在Master服务器上的add、update、delete等操作都会记录在binlog文件中

    $/etc/init.d/mysql restart   或者 service mysqld restart

    7、记录复制启动断点
    执行以下命令,记录从服务器开始启动复制的断点,包括日志名和偏移量。
      mysql> SHOW MASTER STATUS;
    比如:
      mysql> show master statusG
         File: mysql-bin.001
         Position: 73
         Binlog_Do_DB:
                     Binlog_Ignore_DB:
    日志文件名是:mysql-bin.001
    偏移量是:73
    注意,等会从服务器将从这个位置开始复制。需要记录下这2个地方。

    二、设置同步Slave服务器

    1.   导入数据到从服务器器:
    我用的是$mysql -u root -p news < news.sql

    2、如果是用压缩的办法:
    传输拿到主库数据包、解包
    # cd /var/lib/mysql/
    # scp 192.168.0.1:/var/lib/mysql/news.tar.gz .
    # tar zxvf var.tar.gz
    查看修改news文件夹权限
    # chown -R mysql:mysql news

    3, 设置同步Slave的my.cnf
    server-id       = 2 
    # log-bin=mysql-bin    #我没有用到,只需要从A同步到B即可
    master-host     =   192.168.0.1
    master-user     =   backup
    master-password =  backuppass
    master-port     =  3306
    #上面是前面添加的用户名和密码,下面3行是新版本的sql自带的表。
    replicate-ignore-db = mysql       #忽略掉的数据库
    replicate-ignore-db = test           #忽略掉的数据库
    replicate-ignore-db = information_schema  #忽略掉的数据库
    replicate-do-db = news  #需要备份的数据库名
    replicate_do_table = news.user   #需要备份的数据表名
    master-connect-retry=60  #如果从服务器发现主服务器断掉,重新连接的时间差(秒)
    #log-slave-updates  #我没有用到,如果从服务器也要更新记录到二进制文件里
    slave-skip-errors  #是跳过错误,继续执行复制操作

    设置完成后,首先检查/var/lib/mysql/目录下是否有mysql的启动关闭日志,类似的为*.info,localhost*,ib*之类的日志 信息。如果有全部删除(提示:先停止mysql服务,再删除),然后启动mysql服务。

    4、验证连接MASTER
    # mysql -h192.168.0.1 -ubackup -pbackuppass
     主机IP、用户名、密码前面不能带有空格

    5、设置Master服务器信息,让Slave知道Master的位置

    以往的方式是直接在my.cnf中設定master的相關訊息;但是,這樣的方式已經改了,必须使用在 mysql下執行【CHANGE MASTER TO】的指令

    在my.cnf中master是錯誤的

    master-host     =   192.168.0.1
    master-user     =   backup
    master-password =  backuppass
    master-port     =  3306


    slave stop;  
    MySQL> CHANGE MASTER TO 
    -> MASTER_HOST='192.168.0.1',  
    -> MASTER_USER='backup',  
    -> MASTER_PASSWORD='backuppass',  
    -> MASTER_LOG_FILE='mysql-bin.001',  
    -> MASTER_LOG_POS=73;  
    slave start; 

    6,检查同步是否成功
    用show slave status;看一下从服务器的同步情况
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    如果都是yes,那代表已经在同步 。

    Seconds_Behind_Master是否为0,0就是已经同步了

    出现Slave_IO_Running:NO,可能需要开启:
    slave stop;  
    SLAVE start IO_THREAD
    slave start; 

    另外,出现Slave_IO_Running:NO还有一个原因是slave上没有权限读master上的数据。

  • 相关阅读:
    scala之旅-核心语言特性【多参数列表(柯里化)】(十二)
    scala之旅-核心语言特性【嵌套函数】(十一)
    集合+队列+锁
    JVM + GC 一遍过
    java agent测试
    actuator
    大话设计模式
    leetcode刷题之mysql精彩集锦
    Redis怎么保证与Mysql缓存一致性
    springcloud
  • 原文地址:https://www.cnblogs.com/donizzh/p/4599650.html
Copyright © 2020-2023  润新知