系统变迁之四--mysql主从同步

主从同步

第一篇文章说过,初始版本的系统一直单库运行,所有的读、写,以及数据存储都放在了同一台dbserver中。出现问题,哭都没地方...于是...增加多个dbserver,单主库多从库,避免出现单库数据文件问题导致的数据损失...

修改数据文件的存储位置

mysql默认的数据库文件是放在安装目录下的(/var/lib/mysql),先把这个路径设定到阿里云数据盘,防止系统更新或者其他问题时造成数据文件损坏。

  • 使用root用户或具有root权限的用户,在目标路径下新建一个目录,比如叫做mysqldata,并修改其权限
    mkdir /alidata1/mysqldata
    chown -R mysql:mysql /alidata1/mysqldata/  ← 改变数据库的归属为mysql

  • 把MySQL服务进程停掉(一开始就做了,或者半夜干吧...):
    mysqladmin -u root -p shutdown

  • 把/var/lib/mysql整个目录移到/alidata1/mysqldata
    mv /var/lib/mysql /alidata1/mysqldata

  • 找到my.cnf配置文件,如果/etc/目录下没有my.cnf配置文件,请到/usr/share/mysql/下找到*.cnf文件,拷贝其中一个到/etc/并改名为my.cnf)中。命令如下:
    cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

  • 编辑MySQL的配置文件/etc/my.cnf,为保证MySQL能够正常工作,需要指明mysql.sock文件的产生位置。修改socket=/var/lib/mysql/mysql.sock一行中等号右边的值为:/alidata1/mysqldata/mysql.sock 。操作如下:
    vi  my.cnf  (用vi工具编辑my.cnf文件,找到下列数据修改之)
    # The MySQL server[mysqld]  port = 3306
    #socket  = /var/lib/mysql/mysql.sock(原内容,为了更稳妥用“#”注释此行)
    socket  = /alidata1/mysqldata/mysql.sock (加上此行)

     // 为了防止binlog日志挤爆硬盘,加入另外的配置:
     expire_logs_days = 10  (表示binlog日志过期时间,单位为天,注意这个配置是在每次切换新的log文件时才会清除对应的log文件的。也可以在mysql运行期间命令行执行 set global expire_log_days=10)
    
  • 修改MySQL启动脚本/etc/init.d/mysql,把其中datadir=/var/lib/mysql一行中,等号右边的路径改成你现在的实际存放路径:/alidata1/mysqldata
    vi /etc/init.d/mysql
    #datadir=/var/lib/mysql(注释此行)
    datadir=/alidata1/mysqldata (加上此行)
    如果是CentOS还要改 /usr/bin/mysqld_safe 相关文件位置;最后 做一个mysql.sock 链接:
    ln -s /home/data/mysql/mysql.sock /var/lib/mysql/mysql.sock

  • 重新启动MySQL服务
    /etc/init.d/mysqld start

主库设置成功后,其他的从库也全都按照同样的步骤来操作。

导出及导入数据
  • 在主库服务器中执行以下命令,用于导出对应的数据库
    mysqldump -u mysqlsuperuser -p dbname> dbname.sql
  • 在从库中先建立同名数据库
    mysql -u mysqlsuperuser -p
    create database dbname
  • 使用scp或者别的命令将dbname.sql拷贝到对应的从库服务器(们),并导入:
    mysql -u mysqlsuperuser -p
    source /path/dbname.sql
在主从库中创建用于同步的数据库用户
  • 创建用户
    create user 'dbcopy'@'%' identified by '****'
  • 赋相应的权限
    • 主库
      grant replication slave,replication client on . to 'dbcopy'@'%' identified by '****';
    • 从库
      grant replication slave,replication client on . to 'dbcopy'@'%' identified by '****';
      ......
配置同步选项
  • 修改主库的my.cnf文件
    log_bin = mysql-bin
    server_id = 21013 (必须明确地指定一个唯一的服务器ID 此处取服务器Ip的最后两个段).
    如果之前没有在mysql 的配置文件中指定log_bin 就需要重新启动Mysql。 为了确认二进制日志文件是否已经在主库上创建,使用以下命令查看
    show master status;

  • 修改各从库的my.cnf文件
    备库上也需要做同样的配置,并重启数据库
    log_bin = mysql-bin
    server_id = 208246
    relay_log = /var/lib/mysql/mysql-relay-bin (指定中继日志的位置和命名)
    log_slave_updates = 1 (允许备库将其重放的事件也记录到自身的二进制日志)
    read_only = 1(只读模式,防止多端同时写数据造成各个点的数据不同步)

  • 开启复制
    在从库中执行以下命令
    CHANGE MASTER TO MASTER_HOST='masterIP',
    MASTER_USER='dbcopy',
    MASTER_PASSWORD='****',
    MASTER_LOG_FILE = 'mysql-bin.000002',
    MASTER_LOG_POS=0;
    其中master_log_file和master_log_pos的值都是在主库中使用show master status来取到的。刚开始配置时,pos位置可以指定为0

  • 常用命令
    SHOW SLAVE STATUS; //查看配置信息。
    START SLAVE;//开启复制。
    STOP SLAVE; //停止复制

  • 其他配置

    • 推荐的复制配置
      在主库上二进制日志最重要的选项是:
      sync_binlog =1
      如果开启该选项,mysql每次在提交事物请会将二进制日志同步到磁盘上,保证在服务器崩溃的时候不会丢失事件。
    • 如果使用InnoDB 强烈推荐设置如下选项:
      innodb_flush_logs_at_trx_commit
      innodb_support_xa=1
      innodb_safe_binlog
  • 如果正在使用mysql 5.5 ,最好设置以下选项:
    sync_master_info=1
    sync_replay_log = 1
    sync_relay_long_info =1

出现数据不同步时的处理方案

当出现数据不同步时,一般执行 show slave status;会有以下结果:

Paste_Image.png
 Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件
 Slave_SQL_Running:读取本地日志文件,并执行日志里的SQL命令。

一般是出现同步错误或者master_log的info出现了变化,相应的解决方案如下:

  • 同步错误解决方案:
    slave stop;
    set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; //值为1表示跳过一个错误,可以设置为N。不过跳过去的数据就跟主库不同步了,要手动处理
    slave start;
    show slave status; // 查看同步状态是否恢复正常了
  • 主库日志信息变更导致的错误解决方案
       查看主库
    show master status; //记录下File,Position字段,假设为‘mysql-bin.000004’,98;
    在从库中执行以下命令:
    stop slave;
    change master to master_log_file='mysql-bin.000004',master_log_pos=98;
    start slave;
    show slave status; //查看同步状态
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容