zoukankan      html  css  js  c++  java
  • 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上的数据。

  • 相关阅读:
    python json 和 pickle的补充 hashlib configparser logging
    go 流程语句 if goto for swich
    go array slice map make new操作
    go 基础
    块级元素 行内元素 空元素
    咽炎就医用药(慢性肥厚性咽炎)
    春季感冒是风寒还是风热(转的文章)
    秋季感冒 咳嗽 怎么选药
    解决IE浏览器“无法显示此网页”的问题
    常用的 css 样式 记录
  • 原文地址:https://www.cnblogs.com/donizzh/p/4599650.html
Copyright © 2011-2022 走看看