美文网首页程序猿的进阶屋我爱编程
MySQL主从库配置以及常见问题

MySQL主从库配置以及常见问题

作者: 欢喜明 | 来源:发表于2018-03-19 17:09 被阅读14次

    此文档包含两部分:

    一、MySQL主从库的配置     二、常见问题以及解决方法

    一、MySQL主从库的配置

    说明:

             1、此文档记录的是MySQL主从库最常用的配置方法,即:一主一从(或一主多从)。

                       切记:此种配置一定是主写从读。

             2、MySQL主从库的原理,这里就不介绍了,可以自行百度,这个网址也有详细说明:

                       http://blog.csdn.net/hguisu/article/details/7325124/

             3、本次配置环境:

                       (1)VMware虚拟机;

                       (2)虚拟两台主机:

                                主机(master):系统:ubuntu-16.04-desktop-amd64.iso; IP:192.168.142.166

                                主机(slave):  系统:ubuntu-16.04-desktop-amd64.iso; IP:192.168.142.167

                       (3)MySQL版本:mysql-server_5.6.26-1ubuntu14.04_amd64.deb-bundle.tar

             4、若仅想看主从库的配置,可直接查看第五步、第六步。

    第一步:安装MySQL(已安装则忽略)

             分别在两台主机安装MySQL:

             1、cd

           2、mkdir mysql-deb

           3、cd mysql-deb

           4、下载mysql-server_5.6.26-1ubuntu14.04_amd64.deb-bundle.tar到当前目录

           5、tar -xf mysql-server_5.6.26-1ubuntu14.04_amd64.deb-bundle.tar

           6、安装支持包:sudo apt-get install libaio1

           7、sudo dpkg -i mysql-common_5.6.26-1ubuntu14.04_amd64.deb

           8、sudo dpkg -i mysql-community-server_5.6.26-1ubuntu14.04_amd64.deb

           9、sudo dpkg -i mysql-community-client_5.6.26-1ubuntu14.04_amd64.deb

           启动、停止MySQL命令:

           /etc/init.d/mysqlstart

           /etc/init.d/mysqlstop

           在主库(192.168.142.166)配置文件中注释bind-address = 127.0.0.1 (否则从         库不能远程登录主库)

           cd/etc/mysql

           vi my.cnf

           # bind-address= 127.0.0.1

    第二步:在主库建立数据库(已有库则忽略)

             1、mysql  -uroot  -p

             2、create database osyunweidb CHARACTER SET'utf8mb4' COLLATE                           'utf8mb4_general_ci';

           3、use osyunweidb;

           4、CREATE TABLE `userinfo` (

                  `id` int(20) NOT NULL AUTO_INCREMENT,

                  `name` char(20) DEFAULT NULL,

                  `age` int(11) DEFAULT NULL,

                   `sex` char(2) DEFAULT NULL,

                   PRIMARY KEY (`id`)

                  );

             5、INSERT INTO `userinfo`(name,age,sex) VALUES ( 'adai',18,'1');

    第三步:建立同步用户——从库连接登陆主库的用户(已有用户则忽略)

             1、mysql  -uroot  -p

             2、创建用户:

             GRANTUSAGE ON *.* TO 'osyunweidbbak '@'192.168.142.167' IDENTIFIED BY '123456'          WITH GRANT OPTION;

             用户:osyunweidbbak

             密码:123456

             只能从主机192.168.142.167(从库IP)远程登录

             3、查看用户权限:

             showgrants for osyunweidbbak @'192.168.142.167';

             显示:

    只有 USAGE权限:只允许登录--其它什么也不允许做。

           4、更改用户osyunweidbbak的权限:

             grantreplication slave on *.* to 'osyunweidbbak '@'192.168.142.167' identified by'123456'   with grant option;

             显示:

    授权用户osyunweidbbak只能从192.168.142.167这个IP访问主库(192.168.142.166)     的数据库,并且只具有数据库备份的权限。

             5、刷新系统授权表

                       flushprivileges;     

           6、测试在从库服务器上登录到主库

             mysql-u osyunweidbbak -h 192.168.142.166 -p

    第四步:把主库的数据库导入到从库中

             1、在主库导出数据库(192.168.142.166)

             进入mysql 客户端程序和脚本目录

             cd/usr/bin

           flushtables with read lock;

           mysqldump-u root -p osyunweidb > /home/osyunweidbbak.sql

           unlocktables;

             2、导入数据到从库(192.168.142.167)

             mysql  -u root -p

           source  /home/osyunweidbbak.sql

    第五步:配置主库(192.168.142.166)的my.cnf文件

             1、cd /etc/mysql

             2、vi my.cnf

             配置如图:

    注意:红色框部分。

    说明:

             (1)server-id=1

             #设置服务器id,1表示主服务器(主库),注意:如果原来的配置文件中已经有这一行,      就不用再添加了。

    (2)log_bin=mysql-bin

             #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再   添加了。

    (3)binlog-do-db=osyunweidb

             #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行。

    (4)binlog-ignore-db=mysql

             #不需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行。

             3、重启MySQL

             /etc/init.d/mysqlrestart

             4、查看主库信息

             mysql-u root -p

             showmaster status;

             显示:

    说明:与my.cnf配置的参数一致,同步数据库:osyunweidb,不同步数据库: mysql;          特别注意:这里需要记下File和Position的值,这是从库同步主库数据开始的同步点。

    第六步:配置从库(192.168.142.167)的my.cnf文件

             1、cd /etc/mysql

             2、vi my.cnf

             配置如图:

    注意:红色框部分。

             说明:

             (1)server-id=2

             #设置服务器id,2表示从服务器(从库),注意:如果原来的配置文件中已经有这一行,      就不用再添加了。

    (2)replicate_wild_do_table = osyunweidb.%

             #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行。

    (3)replicate_wild_ignore_table=mysql .%

             #不需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行。

             (4)特别注意,注释掉的两行:

             replicate-do-db=osyunweidb

             replicate-ignore-db=mysql

             从库的配置文件不可用这两个参数,在同步数据的时候会有隐患,参考“二、常见问     题以及解决方法”的说明。

             (5)从库不需要开启二进制日志,除非有必要:如,此从库又作为别的从库的主库,  或者此从库需要增量备份。

             (6)MySQL 5.1.7版本之后,已经不支持把主库(master)配置属性,如:

           master_host='192.168.142.166', master_user='osyunweidbbak',

             master_password='123456', master_log_file='mysql-bin.000006' ,

             master_log_pos=44884752

             写入my.cnf配置文件中了,只把要同步的数据库和要忽略的数据库写入my.cnf即可。

             3、重启MySQL

             /etc/init.d/mysqlrestart

             4、mysql -uroot -p

             5、停止slave同步进程

             stopslave;

             6、执行同步语句(设置主库IP、登录用户名密码、同步文件、同步点)

             changemaster to  master_host='192.168.142.166',master_user='osyunweidbbak',master_password='123456',         master_log_file=' mysql-bin.000006' ,master_log_pos=44884752;

             注意:这里的master_log_file=' mysql-bin.000006' ,master_log_pos=44884752 就是前面在          主库查看并记录下来的File和Position的值。

             7、start slave;

             8、查看slave同步信息

             showslave status\G  (用\G结尾而不是分号结尾,按行显示结果)

             显示:

    注意查看:

           Slave_IO_Running: Yes

           Slave_SQL_Running: Yes

          

    以上这两个参数的值为Yes,即说明配置成功,而正在运行。

           注意核对其他信息是否正确。

    第七步:测试同步是否成功以及一般稳定性

             手工测试只能简单的插入、删除或更新几条数据,所以可以写几行代码随机、长时间、         大批量的对主库插入、删除或更新数据;然后查看主库和从库的数据一致性(简单的只     能看总记录数是否一致了)。

             结果如下(从前一天晚上6点运行到次日8点):

    可以看到,不管是插入数据还是删除数据操作,主库、从库 userinfo表的记录数都保     持一致。数据量已经有28万了。

    OK,主从库配置完毕。

    二、常见问题以及解决方法

    1、从库没有同步主库的数据

    分两种情况:

    1)从库在执行SQL语句时发生错误

    默认下从库在同步数据执行SQL语句时,只要发生错误,就会停止同步,不会跳过;

    (当然主库本就没有执行成功的SQL语句,不会影响从库同步)。

    查看方法:

    ①主服务器(主库)查看进程是否Sleep太多:

    show processlist;

     ②查看主库状态是否正常:

    show master status;

    ③查看从库状态信息:

    show slave status\G

    显示:

    Slave_IO_Running: Yes

    Slave_SQL_Running: No

    Last_SQL_Error: Error 'PROCEDURE BK.zoucmdoes not exist' on query. Default database: 'BK'. Query: 'drop procedure zoucm'

    可见slave没有同步,SQL报错。

    解决方法:

    如果数据可控的情况下,可以忽略错误,继续同步:

    1、停止slave服务器的主从同步:

    stop slave;

    2、跳过一步错误,数字表示跳过多少步:

    set global sql_slave_skip_counter =1;

    3、开启slave服务:

    start slave;

    如果数据已经不可控,可以考虑重做主从库:

    1.先进入主库(192.168.142.166),锁表,防止数据写入

    flush tables withread lock;

    2、备份主库数据:

    mysqldump -uroot-p  > mysqlmaster.bak.sql

    3、重置主库maste

    RESET MASTER;

    4、查看master状态,并记录file和postion

    show master status;

    5、对主库(192.168.142.166)解锁表

    UNLOCK TABLES;

    6、进入从库(192.168.142.167),停止从库的同步状态

    stop slave;

    或者直接停止从库mysql服务

    /etc/init.d/mysql stop

    7、找到从库的中继日志,把中继日志相关的文件都删除

    find / -name mysqld-relay-bin.*

    rm -rf ...

    7、(在从库操作)导入备份数据库

    source mysqlmaster.bak.sql

    8、清除同步信息

    reset slave all;

    9、(在从库操作)配置从库同步,注意同步点,即第4步查看的file和position信息

    change master to master_host='192.168.142.166',master_user='osyunweidbbak',master_password='123456',master_log_file='mysql-bin.000006' ,master_log_pos=44884752;

    注意:这里的master_log_file=' mysql-bin.000006' ,master_log_pos=44884752

    要按实际的填写。

    10、重新开启从库同步

    START SLAVE;

    11、(在从库操作)查看同步状态

    show slave status\G

    显示:

    Slave_IO_Running:Yes

    Slave_SQL_Running:Yes

    2)从库配置文件中使用参数replicate-do-db replicate-ignore-db

    在配置从库的my.cnf文件时,如果使用参replicate-do-db 和replicate-ignore-db 会导致从库同步主库数据时忽略掉主库的跨库更新SQL语句。例如,主库:

    usedb1;

    insert intodb2.userinfo(name,age,sex) values ( 'adai',18,'1');

    那么从库同步时会忽略此语句,即不会同步此数据。

    所以为了避免此问题,应该使用参数:

    replicate_wild_do_table = osyunweidb.%

    replicate_wild_ignore_table=mysql .%

    配置需要同步和不需要同步的数据库。

    2、从库同步状态显示:Slave_IO_Running connecting

    这是从库无法登陆主库。

    主要有三个原因:

    (1)网络不通

    (2)登陆主库的账号密码不对或者权限问题

    (3)position的位置不对

    (4)主库的配置文件my.cnf 没有注释bind-address = 127.0.0.1

    一一检查即可。

    完毕。

    相关文章

      网友评论

        本文标题:MySQL主从库配置以及常见问题

        本文链接:https://www.haomeiwen.com/subject/frppqftx.html