美文网首页程序猿的进阶屋我爱编程
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