mysql之主从复制篇

http://2526575.blog.51cto.com/2516575/689199?token=BAkPV1ddW23Ssa6EnpGNjJs

 

在实际企业应用环境当中,单台mysql数据库是不足以满足日后业务需求的。譬如服务器发生故障,没有备份服务器来提供服务的话,业务就得停止。介于这种情况,我们来学习一下mysql主从复制。

使用mysql主从复制的好处有:

1、采用主从服务器这种架构,稳定性得以提升。如果主服务器发生故障,我们可以使用从服务器来提供服务。

2、在主从服务器上分开处理用户的请求,可以提升数据处理效率。

3、将主服务器上的数据复制到从服务器上,保护数据免受意外的损失。

环境描述:

新企业要搭建架构为主从复制的mysql数据库。

主服务器(mysql-master):IP地址:192.168.48.128,mysql已安装,没有用户数据。

从服务器(mysql-slave):IP地址:192.168.48.130,mysql已安装,没有用户数据。

主从服务器均可正常提供服务。

 

01

主从复制配置如下:

在主服务器上操作:

1)、确保/etc/my.cnf中有如下参数,没有的话需手工添加,并重启mysql服务。

[mysqld]

log-bin=mysql-bin 启动二进制文件

server-id=1 服务器ID

2)、登录mysql,在mysql中添加一个backup的账号,并授权给从服务器。

[[email protected] ~]# mysql -uroot –p123456 登录mysql

mysql> grant replication slave on *.* to 'backup'@'192.168.48.130' identified by 'backup'; 创建backup用户,并授权给192.168.48.130使用。

02

3)、查询主数据库状态,并记下FILE及Position的值,这个在后面配置从服务器的时候要用到。

mysql> show master status;

03

在从服务器上操作:

1)、确保/etc/my.cnf中有log-bin=mysql-bin和server-id=1参数,并把server-id=1修改为server-id=10。修改之后如下所示:

[mysqld]

log-bin=mysql-bin 启动二进制文件

server-id=10 服务器ID

2)、重启mysql服务。

[[email protected] ~]# mysqladmin -p123456 shutdown
[[email protected] ~]# mysqld_safe --user=mysql &

04

3)、登录mysql,执行如下语句

[[email protected] ~]# mysql -uroot –p123456

mysql> change master to master_host='192.168.48.128',master_user='backup',master_password='backup',master_log_file='mysql-bin.000003',master_log_pos=401;

05

4)、启动slave同步。

mysql> start slave;

06

5)、检查主从同步,如果您看到Slave_IO_Running和Slave_SQL_Running均为Yes,则主从复制连接正常。

mysql> show slave status\G

07

验证配置是否正常,mysql主从能否正常复制。

在主数据库上新建一个库,并且在库中写一个表和一些数据。

[[email protected] ~]# mysql -uroot –p123456

mysql> create database mysqltest;

mysql> use mysqltest;

mysql> create table user(id int(5),name char(10));

mysql> insert into user values (00001,'zhangsan');

08

在从数据库中验证一下,是否正常复制到数据。

[[email protected] ~]# mysql -uroot –p123456

mysql> show databases;

09

 

mysql> select * from mysqltest.user;

 

10

从上图中的结果,我们可以看到mysql主从复制已经在起作用了,我们在主数据库中写入的数据已经复制到我们的从数据库中了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

环境如下:

单台数据库存有数据,要升级为主从复制的架构。

主数据库:mysql-master:IP192.168.48.128,数据库正常提供服务,有数据。

从数据库:mysql-slave:IP192.168.48.130,数据库正常提供服务,无数据。

01

升级大致步骤如下:

1、修改主数据库配置文件,开启总从复制必要的功能。

2、在主数据库中创建一个账号并授权给从数据库使用。

3、导出主数据库中的数据作。

4、修改从数据库配置文件,开启总从复制必要的功能。

5、把刚才主数据库中导出的数据导入到从数据库。

6、在从数据库中配置连接主数据库要用到的账户、密码等。

7、启动主从复制功能,并检查是否正常复制。

开始升级:

在主数据库上操作:

1)、确保/etc/my.cnf中有如下参数,没有的话需手工添加,并重启mysql服务。

[mysqld]

log-bin=mysql-bin 启动二进制文件

server-id=1 服务器ID

2)、登录mysql,在mysql中添加一个backup的账号,并授权给从服务器。

[[email protected] ~]# mysql -uroot –p123456 登录mysql

mysql> grant replication slave on *.* to 'backup'@'192.168.48.130' identified by 'backup'; 创建backup用户,并授权给192.168.48.130使用。

02

3)、查看已有的数据库有哪些;

mysql> show databases;

02-1

4)、进行锁表操作,不让数据进行写入动作,这么做事为了防止从数据库的原始数据和主数据库的原始数据不一致。

mysql> flush tables with read lock;

03

5)、查询主数据库状态,并记下FILE及Position的值,这个在后面配置从服务器的时候要用到。

mysql> show master status;

04

6)、切换一个终端,使用mysqldump命令将刚才查询到的两个库导出来。

mysql> mysqldump –uroot –p123456 mysqltest > mysqltest.sql

mysql> mysqldump –uroot –p123456 test1234 > test1234.sql

05

7)、将导出来的库文件传送到从数据库的/root目录下。

[[email protected] ~]#scp mysqltest.sql test1234.sql [email protected]:/root/

这中间需要输入一次验证口令。见下图

06

8)、切换回之前的终端,进行表解锁操作。

mysql> unlock tables;

07

主数据库服务器上的操作告一段落。

在从数据库上操作:

1)、确保/etc/my.cnf中有log-bin=mysql-bin和server-id=1参数,并把server-id=1修改为server-id=10。修改之后如下所示:

[mysqld]

log-bin=mysql-bin 启动二进制文件

server-id=10 服务器ID

2)、重启mysql服务。

[[email protected] ~]# mysqladmin -p123456 shutdown
[[email protected] ~]# mysqld_safe --user=mysql &

08

3)、登录数据库,确认要同步的库名不存在。

[[email protected] ~]# mysql -uroot –p123456

mysql> show databases;

 

09

4)、创建名为mysqltest和test1234的库。

mysql> create database mysqltest;

mysql> create database test1234;

10

4)、切换一个终端,将传过来的两个数据文件分别导入对应的数据库下。

[[email protected] ~]# mysql -uroot –p123456 mysqltest < mysqltest.sql

[[email protected] ~]# mysql -uroot –p123456 test1234 &lt; test1234.sql

11

5)、切换回之前的终端,执行如下语句

mysql> change master to master_host='192.168.48.128',master_user='backup',master_password='backup',master_log_file='mysql-bin.000003',master_log_pos=1650;

 

5)、切换回之前的终端,执行如下语句

mysql> change master to master_host='192.168.48.128',master_user='backup',master_password='backup',master_log_file='mysql-bin.000003',master_log_pos=1650;

 

6)、启动主从复制功能。

mysql> start slave;

13

7)、

检查主从同步,如果您看到Slave_IO_Running和Slave_SQL_Running均为Yes,则主从复制连接正常。

mysql> show slave status\G

14

验证主从是否正常配置:

在主数据库上插入数据:

mysql> show databases;

mysql> show tables;

mysql> use mysqltest;

mysql> select * from user;

mysql> insert into user values (4,'ergou');

mysql> insert into user values (5,'sanwazi');

16

在从数据库上查看是否正常同步:

mysql> show databases;

mysql> use mysqltest;

mysql> select * from user;

17

上图可以看出,主从之间已经可以正常复制了。

今天就先到这里吧O(∩_∩)O~

 

mysql主从复制碰到的小问题

一个朋友在做mysql主从复制的时候碰到了一些问题,他已经按照我之前的教程一步步做了。但是就是不知道是怎么回事。从数据库中使用命令show slave status\G查看到的结果如下图:

000

 

我们知道,要想mysql主从复制成功的先决条件是Slave_IO_Running和Slave_SQL_Running均为Yes,而上图所示的结果显然是有一个不满足条件。

再根据Last_IO_Error的错误代码2013及下面的错误提示我们可以知道,从数据库无法正常连接到主数据库。

这里原因有三:

1、主数据库没有给从数据库登录授权

2、网络不通

3、有防火墙

明白这三点之后我们就可以针对原因依次来解决它们:

登录主数据库,给从数据库授权

[[email protected]host ~]# mysql -uroot –p123456 登录主数据库

mysql> grant replication slave on *.* to 'backup'@'192.168.48.130' identified by 'backup'; 创建backup用户,并授权给从数据库连接使用。

02

检查网络是否通畅

[[email protected] ~]# ping -c 4 192.168.48.128 再从服务器上ping主服务器。

QQ截图20111013104639

分别在主从服务器上检查防火墙状态

我们可以直接关闭防火墙

运行命令:[[email protected] ~]# setup

111111111111

选择防火墙(Firewall configuretion)这一项.

001

将它Disabled掉。

002

或者你可以直接使用命令:

[[email protected] ~]# service iptables stop 即时生效,系统重启后失效

[[email protected] ~]# chkconfig iptables off 当前状态无效,系统重启后生效

大家可以结合使用

222222222

以上情况都排除完毕,我们来再测试一下主从是否能正常连接。

在从数据库中执行如下命令:

mysql>stop slave;

mysql>start slave;

000-1

然后查看主从连接状态

mysql>show slave status\G

07

经过上述操作,我那位朋友成功排除了主从不能复制的故障。

故障2:报错如下:

意思就是从上的server_id和主的一样的,经查看发现从上的/etc/my.cnf中的server_id=1这行我没有注释掉(在下面复制部分我设置了server_id),于是马上把这行注释掉了,然后重启mysql,发现还是报同样的错误。

使用如下命令查看了一下server_id

show variables like 'server_id';

发现,mysql并没有从my.cnf文件中更新server_id,既然这样就只能手动修改了

mysql> set global server_id=10; #此处的数值和my.cnf里设置的一样就行
mysql> slave start;

如此执行后,slave恢复了正常。

不过稍后蚊子使用/etc/init.d/mysqld restart重启了mysql服务,然后查看slave状态,发现又出现了上面的错误,然后查看server_id发现这个数值又恢复到了1。

之后蚊子又重新查看了一下/etc/my.cnf的内容,确认应该不是这个文件的问题,于是去google查了一下,看到mysql在启动的时候会查找/etc/my.cnf、DATADIR/my.cnf,USER_HOME/my.cnf。