(转)不停止MySQL服务增加从库的两种方式

原创
小哥 2年前 (2023-05-24) 阅读数 39 #大杂烩

转自:http://lizhenliang.blog.51cto.com/7876557/1669829

现在生产环境MySQL数据库为一主一从,由于业务量和访问量的不断增加,增加了一个从数据库。前提是不能影响在线业务的使用,即不能重新启动MySQL服务,为避免其他情况,选择在网站流量低高峰期运营。

在线添加从数据库一般有两种方式,一种是通过mysqldump备份主数据库,还原到辅助数据库,mysqldump是逻辑备份,当有大量数据时,备份速度会很慢,锁定表的时间也会很长。另一种方式是通过xtrabackup工具备份主数据库,还原到辅助数据库,xtrabackup它是物理备份,备份速度快,没有表锁定。为什么不锁定手表?由于它监视主数据库日志,如果有更新的数据,则会先将其写入文件,然后再返回到备份文件以保持数据一致性。

服务器信息:

主库:192.168.18.212(原有)

从库1:192.168.18.213(原有)

从库2:192.168.18.214(新增)

数据库版本:MySQL5.5

存储引擎:Innodb

测试库名称:weibo

一、mysqldump方式

MySQL主从基于binlog日志,因此需要在安装数据库后启用它binlog。这样做的好处是,一方面可以使用binlog另一方面,还原数据库可以为主要任务做准备。

原始主数据库配置参数如下:

1

2

3

4

5

6

# vi my.cnf

server- id = 1 #id要唯一

log-bin = mysql-bin #开启binlog日志

auto-increment-increment = 1 #在Ubuntu系统中MySQL5.5将来,它已被默认为1

auto-increment-offset = 1

slave-skip-errors = all #跳过主从复制中的错误

  1. 在主数据库中创建同步帐户

1

mysql> grant all on *.* to sync @ 192.168.18.% identified by sync ;

  1. 从库配置MySQL

1

2

3

4

5

6

# vi my.cnf

server- id = 3 #这个设置3

log-bin = mysql-bin #开启binlog日志

auto-increment-increment = 1 #这两个参数是Ubuntu系统中MySQL5.5将来,它已被默认为1

auto-increment-offset = 1

slave-skip-errors = all #跳过主从复制中的错误

  1. 备份主库

1

# mysqldump -uroot -p123 --routines --single_transaction --master-data=2 --databases weibo > weibo.sql

参数说明:

--routines:导出存储过程和函数

--single_transaction在导出开始时设置事务隔离状态,并使用一致的快照启动事务,然后unlock tables;而lock-tables它锁定一个表,直到dump完毕。

--master-data:默认值等于1,将dump起始(change master to)binlog点和pos该值写入结果中,等于2是将change master to写到结果中并注释。

  1. 将备份库复制到从属库

1

# scp weibo.sql root@192.168.18.214:/home/root

  1. 在主库中创建test_tb表,模拟数据库中的新数据,weibo.sql是没有的

1

mysql> create table test_tb( id int,name varchar(30));

  1. 从库导入备份库

1

2

# mysql -uroot -p123 -e create database weibo;

# mysql -uroot -p123 weibo < weibo.sql

  1. 备份文件weibo.sql查看binlog和pos值

1

2

# head -25 weibo.sql

-- CHANGE MASTER TO MASTER_LOG_FILE= mysql-bin.000001 , MASTER_LOG_POS=107; #大概22行

  1. 从库中的此日志点设置同步并开始

1

2

3

4

5

6

mysql> change master to master_host= 192.168.18.212 ,

-> master_user= sync ,

-> master_password= sync ,

-> master_log_file= mysql-bin.000001 ,

-> master_log_pos=107;

mysql> start slave;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

mysql> show slave statusG;

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id :    90

Current database: *** NONE ***

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.18.212

Master_User: sync

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 358

Relay_Log_File: mysqld-relay-bin.000003

Relay_Log_Pos: 504

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

......

可以看到IO和SQL线程均为YES,表示主从配置成功。

  1. 从库查看weibo库中的表

1

2

3

4

5

mysql> show tables;

+---------------------------+

| Tables_in_weibo           |

+---------------------------+

| test_tb                   |

发现了之前创建的模拟test_tb表已同步!

二、xtrabackup方法(推荐)

基于上述配置,进行实验并首先删除从库配置:

1

2

3

4

mysql> stop slave; #停止同步

mysql> reset slave; #从连接信息中清除

mysql> show slave statusG; #再次查看状态,您可以看到IO和SQL线程都为NO

mysql> drop database weibo; #删除weibo库

在这一点上,与新安装的一样,继续前进!

  1. 主库使用xtrabackup备份

1

# innobackupex --user=root --password=123 ./

生成一个以时间命名的备份目录:2015-07-01_16-49-43

1

2

3

4

5

6

7

8

9

10

11

12

13

# ll 2015-07-01_16-49-43/

total 18480

drwxr-xr-x 5 root root     4096 Jul  1 16:49 ./

drwx------ 4 root root     4096 Jul  1 16:49 ../

-rw-r--r-- 1 root root      188 Jul  1 16:49 backup-my.cnf

-rw-r----- 1 root root 18874368 Jul  1 16:49 ibdata1

drwxr-xr-x 2 root root     4096 Jul  1 16:49 mysql/

drwxr-xr-x 2 root root     4096 Jul  1 16:49 performance_schema/

drwxr-xr-x 2 root root    12288 Jul  1 16:49 weibo/

-rw-r--r-- 1 root root       21 Jul  1 16:49 xtrabackup_binlog_info

-rw-r----- 1 root root       89 Jul  1 16:49 xtrabackup_checkpoints

-rw-r--r-- 1 root root      563 Jul  1 16:49 xtrabackup_info

-rw-r----- 1 root root     2560 Jul  1 16:49 xtrabackup_logfile

  1. 将备份目录复制到从属库

1

# scp -r 2015-07-01_16-49-43 root@192.168.18.214:/home/root

  1. 从库上把MySQL服务已停止,已删除datadir目录,将备份目录重命名为datadir目录

1

2

3

4

5

6

# sudo rm -rf /var/lib/mysql/

# sudo mv 2015-07-01_16-49-43/ /var/lib/mysql

# sudo chown mysql.mysql -R /var/lib/mysql

# sudo /etc/init.d/mysql start

# ps -ef |grep mysql    #检查它是否已正常启动

mysql     8832     1  0 16:55 ?        00:00:00 /usr/sbin/mysqld

  1. 在主库中创建test_t b2 表,模拟数据库中的新数据

1

mysql> create table test_tb2( id int,name varchar(30));

  1. 从备份目录xtrabackup_info文件采集binlog和pos位置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# cat /var/lib/mysql/xtrabackup_info

uuid = 201af9db-1fce-11e5-96b0-525400e4239d

name =

tool_name = innobackupex

tool_command = --user=root --password=... ./

tool_version = 1.5.1-xtrabackup

ibbackup_version = xtrabackup version 2.2.11 based on MySQL server 5.6.24 Linux (x86_64) (revision id : )

server_version = 5.5.43-0ubuntu0.12.04.1-log

start_time = 2015-07-01 16:49:43

end_time = 2015-07-01 16:49:46

lock_time = 1

binlog_pos = filename mysql-bin.000001 , position 429 #这个位置

innodb_from_lsn = 0

innodb_to_lsn = 1598188

partial = N

incremental = N

format = file

compact = N

compressed = N

  1. 从库中的此日志点设置同步并开始

1

2

3

4

5

6

mysql> change master to master_host= 192.168.18.212 ,

-> master_user= sync ,

-> master_password= sync ,

-> master_log_file= mysql-bin.000001 ,

-> master_log_pos=429;

mysql> start slave;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

mysql> show slave statusG;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.18.212

Master_User: sync

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 539

Relay_Log_File: mysqld-relay-bin.000002

Relay_Log_Pos: 363

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

......

可以看到IO和SQL线程均为YES,表示主从配置成功。

  1. 从库查看weibo库中的表

1

2

3

4

5

6

mysql> show tables;

+---------------------------+

| Tables_in_weibo           |

+---------------------------+

| test_tb                   |

| test_tb2                  |

发现了之前创建的模拟test_tb2表已同步。

更多Xtrabackup用于查看博客文章: http://lizhenliang.blog.51cto.com/7876557/1612800

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门