zoukankan      html  css  js  c++  java
  • mysql 数据库的主从同步

    1.复制准备

    操作系统 centOS

    主库(mysql master):  ip为123.56.94.1   port为3306  mysql 版本 5.7.16
    从库(mysql slave):    ip为123.56.94.2   port为3306   mysql 版本 5.7.16    如果版本不一致可能造成字符集不支持的情况例如 5.1 不支持utf8mb4,在迁移时就悲剧了
     
     
    2.主库上执行操作
    2.1设置server-id值并开启binlog参数
    根据mysql的同步原理,我们知道复制的关键因素就是binlog日志.
    执行vim /etc/my.cnf编辑my.cnf配置文件,按如下两个参数内容修改:
    [mysqld]
    server-id = 1
    log-bin = mysql-bi
    提示:
    1.上面两参数放在my.cnf中的[mysqld]模块下,否则会出错;
    2.要先在my.cnf文件中查找相关参数,并按要求修改,不存在时在添加参数,切记,参数不能重复;
    3.修改my.cnf配置后需要重启数据库命令为: service mysqld  restart
    补充:如果按照以上my.cnf配置会把所有数据库都同步,如果只想同步czjmove3而不想同步mysql和test增加如下配置
    binlog-do-db=czjmove3
    # 忽略的数据库
    binlog-ignore-db=mysql
    binlog-ignore-db=test
    检查配置后的结果(这是一个好的习惯):
    grep  -E  "server-id|log-bin" /etc/my.cnf          # 查看/etc/my.cnf文件配置是否有重复
    没有问题的话重启服务:service mysqld  restart
    mysql -uroot -p'123123' -e "show variables like 'server_id'"          # 查看实际mysql配置有没有成功
     
    2.2建立用于同步的账号rep
    登陆mysql 3306实例主数据库
    mysql  -uroot  -p'123123'
    mysql>select user();    查看用户
    mysql>grant  replication  slave  on  *.*  to  'rep'@'123.56.94.2'  identified  by  "123456";  建立用于库复制的账号rep
    提示:
    #replication  slave为mysql同步的必须权限,此处不要授权all
    #*.*表示所有库所有表,库也是可以指定具体的库和表进行复制,如test.test1(test库的test1表);
    #'rep'@'123.56.94.%' rep为同步账号,123.56.94.%为授权主机,使用了%表示允许整个123.56.94.0网段以rep用户访问 此处123.56.94.2只开通这一个IP;
    #identified  by  "123456" , 123456为密码,实际环境时复杂一点为好。
    再次检查创建的rep账号
    select distinct concat ('user:', user, '@', host) as users from mysql.user;
    select  user.host  from  mysql.user;
    mysql>show  grants  for  rep@'123.56.94.2';    查看用户权限   
     
    2.3对数据库锁表只读(当前窗口不要关闭)
    生产环境时,操作主从复制,需要申请停机时间,锁表会影响业务。
    mysql>flush  tables  with  read  lock;
    提示:
    这个锁表命令的时间,在不同引擎的情况,会受下面参数的控制,锁表时,如果超过设置时间不操作会自动解锁;
    interactive_timeout = 60
    wait_timeout = 60
    默认情况下的时长为:
    mysql>show  variables  like  "%timeout%";  可以查看到默认值很大
    完成后测试下是否锁表,打开另一窗口创建一test1表,是不会执行的,证明锁表不能更新,但可读,不可写,因为是read读锁,锁表主要是为了导出数据库文件,从而取得正确的偏移量的值,保证导入从数据库,数据一致。
     
    2.4查看主库状态
    查看主库状态,即当前日志文件名和二进制日志偏移量
    show  master  status;命令显示的信息要记录在案,后面的从库复制时是从这个位置开始的。
     
    2.5导出数据库数据
    单开新窗口,导出数据库数据,如果数据库量很大(100G+),并且允许停机可以,可以直接停库打包数据文件迁移。
    mkdir  /server/backup/  -p
    mysqldump  -uroot  -p"123123"   -A  -B  | gzip  > /server/backup/mysql_bak.$(date  +%F).sql.gz
    #注意,-A表示备份所有库, -B表示增加user  DB和drop等参数(导库时会直接覆盖所有的)。
    ls  -l  /server/backup/mysql_bak.$(date  +%F).sql.gz
    为了确保导库期间,数据库没有数据插入,可以再检查下主库状态信息
    mysql  -uroot  -p"123123"   -e  "show  master  status"
    提示,无特殊情况,binlog文件及位置点是保持不变的。
    导库后,解锁主库,恢复可写;
    mysql>unlock  tables;
    特别提示,有读者这里犯迷糊,实际上做从库的,无论主库更新多少数据了,最后从库都会从上面show  master  status  的位置很快赶上主库的位置进度的。
     
    2.6把主库备份的mysql数据迁移到从库
    这步常用命令有scp,rsync等。
    ls  -l  /server/backup/mysql_bak.$(date  +%F).sql.gz
     
     

    3.从库上执行操作

    3.1 设置server-id值并关闭binlog设置

    数据库的server-id一般在LAN内是唯一的,这里的server-id要和主库及其他从库不同,并注释掉从库的binlog参数配置;

    执行vi  /etc/my.cnf  编辑my.cnf配置文件,按如下两个参数内容修改;

    [mysqld]

    server-id = 2

    #log-bin = mysql-bin

    补充:以下5行我实际项目中没有添加也没测过应该没问题

    master-connect-retry=60     # 预设重试间隔60秒

    replicate-do-db=vbb     # 告诉slave只做vbb数据库的更新

    replicate-ignore-db=mysql     # 不同步的数据库

    replicate-ignore-table=vbb.users    # 不同步vbb数据库的users表

    log-slave-updates=1

    检查配置后的结果

    grep  -E  "server-id|log-bin"  /etc/my.cnf

    #log-bin = mysql-bin   log-bin后面也可以不带等号内容,mysql会使用默认日志。

    重启从数据库

    /etc/init.d/mysql  restart

    3.2还原主库导出的数据到从库

    cd  /server/backup/ &&  ls -l

    然后解压刚才备份的

    gzip  -d  mysql_bak.2017-07-25.sql

    恢复命令

    mysql  -uroot  -p"123123"  <  mysql_bak.2017-07-25.sql

    3.2登陆从库配置同步参数

    mysql  -uroot  -p"123123"

    CHANGE  MASTER  TO   连接主数据库

    MASTER_HOST="123.56.94.1",    这里是主库的ip

    MASTER_PORT=3306,   这里是主库的端口,从库的端口可以和主库不同

    MASTER_USER="rep",   这里是主库上建立的用于复制的用户rep

    MASTER_PASSWORD="123456",   这里是rep的密码

    MASTER_LOG_FILE="mysql-bin.000004",   这里是show  master  status时查看到的二进制日志文件名称,注意:1.不能多空格;2.主数据库导出数据前的值,不是现在再执行的。

    MASTER_LOG_POS=1273;    这里是show  master  status时查看到的二进制日志偏移量,注意不能多空格。

    不登陆数据库,在命令行快速执行change  master的语句(适合在脚本中批量建slave库用)

    cat  | mysql  -uroot -p"oldboy"  <<EOF

    CHANGE  MASTER  TO

    MASTER_HOST="123.56.94.1",

    MASTER_PORT=3306,

    MASTER_USER="rep",

    MASTER_PASSWORD="123456",

    MASTER_LOG_FILE="mysql-bin.000004",

    MASTER_LOG_POS=1273;

    EOF

    3.2启动从库同步开关

    启动从库同步开关,并查看同步状态

    mysql  -uroot  -p"123123"   -e  "start  slave;"

    mysql  -uroot  -p"123123"  -e  "show  slave  statusG;"

    也可登陆数据库里面执行下面两个命令:

    start   slave

    show  slave  statusG;

    判断搭建是否成功就看如下IO和SQL两个线程是否显示为yes状态

    Slave_to_Running: Yes  #负责从库去主库读取binlog日志,并写入从库中继日志中

    Slave_SQL_Running: Yes   #负责读取并执行中继日志中的binlog,转换sql语句后应用到数据库汇总

    也可以执行命令过滤查看如下

    mysql  -uroot  -p"123123"    -e "show  slave  statusG;" | egrep "IO_Running|SQL_Running"

    3.3测试复制结果

    主库创建一数据库,看从库是否有.

    mysql  -uroot -p"123123"    -e "create  database  diablo4;"

    mysql  -uroot -p"123123"  -e  "show  databases  like  'diablo4';"

     
     
     
  • 相关阅读:
    JqueryQrcode生成二维码不支持中文的解决办法
    [转载]浅析海量用户的分布式系统设计
    [转载]大型网站应用中 MySQL 的架构演变史
    CSS3变形记(上):千变万化的Div
    JavaScript进阶之路——认识和使用Promise,重构你的Js代码
    Visual Studio Code预览版Ver 0.3.0试用体验
    Apache Spark 2.3.0 正式发布
    Apache Spark 2.2.0 新特性详细介绍
    Apache Spark 2.2.0 正式发布
    Spark 论文篇-论文中英语单词集
  • 原文地址:https://www.cnblogs.com/aaron-agu/p/7233078.html
Copyright © 2011-2022 走看看