当前位置: 首页 > 科技观察

不停止MySQL服务增加从库的两种方法

时间:2023-03-12 01:09:10 科技观察

现在生产环境MySQL数据库是一主一从。由于业务量访问量越来越大,又增加了一个从库。前提是不能影响线上业务的使用,也就是说不能重启MySQL服务。为避免其他情况,选择在网站流量的低峰期进行操作。一般在线增加从库有两种方式。一种是通过mysqldump备份主库,恢复到从库。Mysqldump是一个逻辑备份。当数据量很大时,备份速度会很慢,锁表的时间会很长。另一种是使用xtrabackup工具备份主库,恢复到从库。xtrabackup是物理备份,备份速度快,无表锁。为什么不锁定表?因为它会监控主库日志,如果有更新的数据,会先写到一个文件中,然后返回到备份文件中,以保持数据的一致性。服务器信息:主库:192.168.18.212(原)从库1:192.168.18.213(原)从库2:192.168.18.214(新)数据库版本:MySQL5.5存储引擎:Innodb测试库名称:weibo1.mysqldump方式MySQL主从是基于binlog日志的,所以安装数据库后必须开启binlog。这样做的好处是,一方面可以使用binlog来恢复数据库,另一方面可以为master和slave做好准备。原主库配置参数如下:#vimy.cnfserver-id=1#id必须唯一log-bin=mysql-bin#openbinloglogauto-increment-increment=1#在Ubuntu系统下,MySQL5.5和后来已经默认1auto-increment-offset=1slave-skip-errors=all#跳过主从复制错误1.主库创建同步账号mysql>grantallon*.*to'sync'@'192.168.18.%'identifiedby'同步';2。从库配置MySQL#vimy.cnfserver-id=3#这个设置3log-bin=mysql-bin#开启binlog日志auto-increment-increment=1#这两个参数在Ubuntu系统MySQL5.5以后都默认了1auto-increment-offset=1slave-skip-errors=all#跳过主从复制错误3.备份主库#mysqldump-uroot-p123--routines--single_transaction--master-data=2--databasesweibo>weibo.sql参数说明:–routines:导出存储过程和函数–single_transaction:设置导出开始时的事务隔离状态,使用一致性快照启动事务,然后解锁表;而lock-tables就是锁定一个表,直到dump完成后才能写入。--master-data:默认等于1,将dumpstart(changemasterto)binlog点和pos值写入result,等于2,将changemasterto写入result和comment。4.将备库复制到从库#scpweibo.sqlroot@192.168.18.214:/home/root5.在主库创建test_tb表,模拟数据库新增数据。weibo.sql没有mysql>createtabletest_tb(idint,namevarchar(30));6。从库导入备份库#mysql-uroot-p123-e'createdatabaseweibo;'#mysql-uroot-p123weibochangemastertomaster_host='192.168.18.212',->master_user='sync',->master_password='sync',->master_log_file='mysql-bin.000001',->master_log_pos=107;mysql>startslave;mysql>showslavestatus\G;ERROR2006(HY000):MySQLserverhasgoneawayNoconnection.Tryingtoreconnect...Connectionid:90Currentdatabase:***NONE******************************1.行***************************Slave_IO_State:WaitingformastertosendeventMaster_Host:192.168.18.212Master_User:syncMaster_Port:3306Connect_Retry:60Master_Log_File:mysql-bin.000001Read_Master_Log_Pos:358Relay_Log_File:mysqld-relay-bin.000003Relay_Log_Pos:504Relay_Master_Log_File:mysql-bin.000001Slave_IO_Running:YesSlave_SQL_Running:Yes...可以看到IO和SQL线程都是YES,说明主从配置成功9、从数据库查看weibo数据库中的表mysql>showtables;+------------------------+|Tables_in_weibo|+------------------------+|测试结核病|发现刚才创建的test_tb表已经同步了!2、xtrabackup方式(推荐)是在上述配置的基础上做实验,先删除slave数据库配置:mysql>stopslave;#停止同步mysql>重置slave;#clearslave连接信息mysql>showslavestatus\G;#然后查看slave状态,可以看到IO线程和SQL线程都是NOmysql>dropdatabaseweibo;#删除微博库至此,从库和新安装的一样了,继续!1.主库使用xtrabackup备份#innobackupex--user=root--password=123./生成一个以时间命名的备份目录:2015-07-01_16-49-43#ll2015-07-01_16-49-43/total18480drwxr-xr-x5rootroot4096Jul116:49./drwx------4rootroot4096Jul116:49../-rw-r--r--1rootroot188Jul116:49backup-my.cnf-rw-r-----1rootroot18874368Jul116:49ibrdata1dr-xr-x2rootroot4096Jul116:49mysql/drwxr-xr-x2rootroot4096Jul116:49performance_schema/drwxr-xr-x2rootroot12288Jul116:49weibo/-rw-r--r--1rootroot21Jul116:49xtrabackup_binlog_info-rw-r-----1rootroot89Jul116:49xtrabackup_checkpoints-rw-r--r--1rootroot563Jul116:49xtrabackup_info-rw-r-----1rootroot2560Jul116:49xtrabackup_logfile2。复制备份目录到从库#scp-r2015-07-01_16-49-43root@192.168.18.214:/home/root3。从库中停止MySQL服务,删除datadir目录,将备份目录重命名为datadir目录#sudorm-rf/var/lib/mysql/#sudomv2015-07-01_16-49-43//var/lib/mysql#sudochownmysql.mysql-R/var/lib/mysql#sudo/etc/init.d/mysqlstart#ps-ef|grepmysql#查看mysql是否已经正常启动88321016:55?00:00:00/usr/sbin/mysqld4.在主库中创建test_tb2表,在数据库中模拟新建数据mysql>createtabletest_tb2(idint,namevarchar(30));5.从备份目录下的xtrabackup_info文件中获取binlog和pos位置#cat/var/lib/mysql/xtrabackup_infouuid=201af9db-1fce-11e5-96b0-525400e4239dname=tool_name=innobackupextool_command=--user=root--password=..../tool_version=1.5.1-xtrabackupibbackup_version=xtrabackupversion2.2.11basedonMySQLserver5.6.24Linux(x86_64)(revisionid:)server_version=5.5.43-0ubuntu0.12.04.1-logstart_time=2015-07-0116:49:43end_time=2015-07-0116:49:46lock_time=1binlog_pos=filename'mysql-bin.000001',position429#这个位置innodb_from_lsn=0innodb_to_lsn=1598188partial=Nincremental=Nformat=filecompact=Ncompressed=N6。设置从库从这个日志点开始同步,启动mysql>changemastertomaster_host='192.168.18.212',->master_user='sync',->master_password='sync',->master_log_file='mysql-bin.000001',->master_log_pos=429;mysql>startslave;mysql>showslavestatus\G;******************************1.row***************************Slave_IO_State:等待mastertosendeventMaster_Host:192.168.18.212Master_User:syncMaster_Port:3306Connect_Retry:60Master_Log_File:mysql-bin.000001Read_Master_Log_Pos:539Relay_Log_File:mysqld-relay-bin.000002Relay_Log_Pos:363Relay_Master_Log_File:mysql-bin.000001Slave_IO_Running:YesSlave_SQL_Running:Yes...可以看到IO和SQL线程都是YES,说明主从配置成功9.查看mysql中的表微博库fromlibrary>showtables;+------------------------+|Tables_in_weibo|+--------------------------+|test_tb|发现刚才创建的test_tb2表已经同步了。