(转)不停止MySQL服务增加从库的两种方式
原创转自: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
mysql> grant all on *.* to
sync
@
192.168.18.%
identified by
sync
;
- 从库配置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
# 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
# scp weibo.sql root@192.168.18.214:/home/root
- 在主库中创建test_tb表,模拟数据库中的新数据,weibo.sql是没有的
1
mysql> create table test_tb(
id
int,name varchar(30));
- 从库导入备份库
1
2
# mysql -uroot -p123 -e create database weibo;
# mysql -uroot -p123 weibo < weibo.sql
- 备份文件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
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,表示主从配置成功。
- 从库查看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库
在这一点上,与新安装的一样,继续前进!
- 主库使用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
# scp -r 2015-07-01_16-49-43 root@192.168.18.214:/home/root
- 从库上把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
- 在主库中创建test_t b2 表,模拟数据库中的新数据
1
mysql> create table test_tb2(
id
int,name varchar(30));
- 从备份目录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
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,表示主从配置成功。
- 从库查看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
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除