《MySQL技术内幕六》-备份和恢复

《MySQL技术内幕-InnoDB存储引擎》-备份和恢复


2019-07-29 ε=(´ο`*)))唉

简单的说说:啥主从备份,冷备,热备,增量备份,日志备份。。。。等等的东东。。。。。

常用工具:mysqldump、ibbackup、replication、xtrabacup、LVM快照备份。。。。

逻辑备份

逻辑备份导出

使用mysqldump【重点】

使用的是**mysqldump 这个工具,导出的是sql文件。可读的。

直接看使用的栗子,再说参数:

# 特定表的条件导出
mysqldump -uroot -proot --databases db1 --tables a1 --where='id=1'  >/tmp/a1.sql
# 运维使用的语句
mysqldump  --single-transaction --master-data=2 --skip-add-locks -u账户 -p'密码' -h 主机 数据库 >/var/lib/mysql/***.sql
# 我瞎写的[没试过的╮(╯_╰)╭]
mysqldump  -uroot -p'123456' --host=localhost  --single-transaction --master-data=2 --skip-add-locks  --databases db1 >/var/lib/mysql/***.sql

参数说明:

  • -u[…] -p[…] -h[…]: 使用的用户名密码和远程数据库地址
  • –databases db1 :指定数据库(指定数据库db1)
  • –tables a1 :指定表
  • –where=‘id=1’ :条件导出的条件
  • –single-transaction :【必须项】获得备份一致性的参数,逻辑为开启一个长事务来导出数据,只对InnoDB有效。【但是不隔离DDL操作】
  • –master-data=2 : 用于控制备份文件,是否有数据库的主库的信息点(CHANGE MASTER。。。。)。为1时,导出主库信息,为2时,此语句被注释掉。【用途就是在配置主从的时候要不要手动配置主库的文件名和位置】【建议是使用手动进行配置:2】【我觉得这里要是1,正式使用如果不停掉业务,不好指定备份点的,看最后主从备份】
  • –skip-add-locks : (取消LOCK语句) 取消对表的锁定,应该是为了避免影响正常业务
  • 参数还有好多。。。略过了。。。

使用 into outfile

使用的是 select ... into outfile的,常用於单表导出:

select * into outfile '/home/bak/test_bak.text' from text;
-- 参数用于特定字符装换 [字段分隔符]【行分割符windows换行符是“\r\n”的问题】
select * into outfile '/home/bak/test_bak.text' fields terminated by ',' lines terminated by '\r\n' from text;

这一种了解一下就可以了,单表的通常很少会使用的。

逻辑备份恢复

作为逻辑备份出来的文件,通常就是SQL语句,所以是可以直接执行就好了:

[root@mysql ~]# mysql -uroot -p <test_back.sql
-- 或者作为资源导入
mysql> source /home/bak/test_back.sql;

mysqldump的导出,是包括存储过程,触发器,导出事件,导出数据,但是是没有视图的,这个要另外操作的。

load data infile 导入

对于以上逻辑备份导出的文件,逻辑SQL命令的,可以用这个来导入。

-- 这个命令的参数与前边into outfile一样的(尤其对字符的转换)
load data into table a ignore 1 lines infile '/home/bak/test_back.sql';
-- ignore n lines:忽略导入前几行

mysqlimport 导入

命令内部也是调用 load data infile 的,所以参数 也是一样的。只是这个可并发导入多个文件。

 mysqlimport --use-threads=2 db1 /home/bak/test_back.sql /home/bak/test_back_2.sql

逻辑备份的备份导出和导入,就这些了 。。。


二进制日志相关的备份

这本书关于这个的内容相当的简略,根本无法操作的,需要自己查资料才行。(ノ`Д)ノ

就是所谓的binlog的备份,常用于增量备份,数据库复制,主从同步的。

默认是不开启的,所以需要配置文件中进行配置:

log-bin = mysql-bin
sync_binlog = 1
innodb_support_xa = 1

简单的binlog的备份,使用的就是mysqlbinglog 命令,很简单,略过了。【因为只能在很简单的场景下使用】

热备 Xtrabackup 工具

这是一个开源的,牛X的热备工具。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex

官方文档地址:https://www.percona.com/doc/percona-xtrabackup/2.4/index.html

这个工具,功能好像很多,这里就简单介绍一点点,其他的看官方的文档了,全量,增量备份啥的文档都有的。

安装

直接用官方的栗子:[CentOS / Amazon Linux AMI]

#为了成功安装Percona XtraBackup libev包需要先安装。libev包可以从EPEL存储库安装 。
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
#安装
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum list | grep percona
yum install percona-xtrabackup-24
#安装完毕后检测
innobackupex --help

常用参数

--defaults-file              #指定MySQL配置文件 ,如果不指定–defaults-file,默认值为/etc/my.cnf
--user=root                  #备份操作用户名,一般都是root用户
/mnt/backup/                 #备份路径
--socket=/tmp/mysql.sock     #指定mysql.sock登录(可通过innobackupex --help查看)
--parallel=2 --throttle=200  #并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。
2>/mnt/backup/bak.log        #备份日志,将备份过程中的输出信息重定向到bak.log
--apply-log                  #在备份目录下生成一个xtrabackup_logfile事务日志文件, 此外,创建新的事务日志。 InnoDB配置从文件“backup-my.cnf”中读取。
--redo-only                  #全备数据后对DB有增量更改,则必须执行此操作,在准备基本完全备份和合并除最后一个之外的所有增量备份时,应使用此选项

全量备份恢复

全量备份的栗子:

[root@szq ~]#  /usr/bin/innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --parallel=2 --throttle=200 /data/db_backup/xtrabackup --socket=/tmp/mysql.sock
 
#执行命令后输出:
xtrabackup: recognized server arguments: 
xtrabackup: recognized client arguments: 
180726 15:00:18 innobackupex: Starting the backup operation
 
IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".
180726 15:00:28 All tables unlocked
180726 15:00:28 Backup created in directory '/data/db_backup/xtrabackup/2018-03-28_17-33-41/'
MySQL binlog position: filename 'master-bin.000008', position '191', GTID of the last change '5be531c0-3252-11e8-a5a9-000c2923f205:1-1079'
180726 15:00:28 [00] Writing /mnt/backup/2018-07-26_15-00-18/backup-my.cnf
180726 15:00:28 [00]        ...done
180726 15:00:28 [00] Writing /mnt/backup/2018-07-26_15-00-18/xtrabackup_info
180726 15:00:28 [00]        ...done
xtrabackup: Transaction log of lsn (1090604498) to (1090604498) was copied.
180726 15:00:29 completed OK!     
 
以上可以看到整个备份过程,说明备份成功!

全量恢复的栗子:

# 在空的数据库下,data/mysql/ /data/mysql_bak/ 这两个目录下都是空的
[root@szq db_backup]# innobackupex --defaults-file=/usr/local/mysql/my.cnf  --user=root --socket=/tmp/mysql.sock --datadir=/data/mysql --copy-back /data/db_backup/xtrabackup/全备份文件夹/

增量备份

增量备份,需要在一次全备份之上继续操作的。

第一次增量备份:

一、以全备目录为基础做增量备份
   --incremental 指定增量备份1的目录
   --incremental-basedir=指定全量备份的目录
 
innobackupex  --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir=/data/db_backup/xtrabackup/全备份文件夹/ --parallel=2 --throttle=200 backup_type = incrementa

第二次增量备份:

二、增量备份1次之后,再次增量备份2的话,需要在增量备份1目录的基础上做增量备份2
   --incremental 指定增量备份2的目录 (增量备份1和增量备份2的目录在同一父目录下)
   --incremental-basedir=指定增量备份1的目录
 
innobackupex  --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir=/data/db_backup/incremental/增量1份文件夹/ --parallel=2 --throttle=200

增量备份 恢复

增量恢复全过程:
############两个备份做整合########################################
 以增备1为基础做增备2,数据如何恢复?   
    先全量备份数据+增量备份1数据合并,然后全量备份数据+增量备份2数据合并,数据最终合并到全量备份目录内:
   --incremental-dir= 先指定增量备份1的目录
innobackupex --defaults-file=/usr/local/mysql/my.cnf  --user=root --socket=/tmp/mysql.sock --apply-log  --redo-only /data/db_backup/xtrabackup/全备份文件夹/ --incremental-dir=/data/db_backup/incremental/增量1份文件夹/
 
   --incremental-dir= 先指定增量备份2的目录
innobackupex --defaults-file=/usr/local/mysql/my.cnf  --user=root --socket=/tmp/mysql.sock --apply-log  --redo-only /data/db_backup/xtrabackup/全备份文件夹/ --incremental-dir=/data/db_backup/incremental/增量2份文件夹/
######################################################################
 
2.1、准备增量备份2:在全备的基础上增备,已全备目录为基础做增备2:
    备注:每次的增量备份,都可以以全量备份为基础做增量备份1、2、3、4 ~~~~
 
    --incremental 指定增量备份2的目录
    --incremental-basedir=指定全备的目录
innobackupex  --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir=/data/db_backup/xtrabackup/全备份文件夹/ --parallel=2 --throttle=200 backup_type = incrementa
######################################################################
备份完毕后,可以通过检查文件的LSN号,来确认增量备份文件的一致性:xtrabackup_checkpoints 
  backup_type = full-prepared
  from_lsn = 0
  to_lsn = 1732070
  last_lsn = 1732070
  compact = 0
  recover_binlog_info = 0
###################################################################### 
优点:数据恢复的时候,直接全备数据+最后一次增量备份n做数据合并,而不是[全量备份数据+增量备份1数据+增量备份2数据合并]
######################################################################
三、在全备目录上重放已提交的事务:
innobackupex --defaults-file=/usr/local/mysql/my.cnf  --user=root --socket=/tmp/mysql.sock --apply-log  --redo-only /data/db_backup/xtrabackup/全备目录/
 
四、全量备份数据+增量备份2数据合并,数据最终合并到全量备份目录内:
   --incremental-dir= 指定增量备份2的目录
innobackupex --defaults-file=/usr/local/mysql/my.cnf  --user=root --socket=/tmp/mysql.sock --apply-log  --redo-only /data/db_backup/xtrabackup/全备目录/ --incremental-dir=/data/db_backup/incremental/定增量备份2/
 
五、在全备目录(增量数据+全备数据合并) 开始回滚未提交的事务:
innobackupex --defaults-file=/usr/local/mysql/my.cnf  --user=root --socket=/tmp/mysql.sock --apply-log /data/db_backup/xtrabackup/全备目录/
 
#####################################################################################
六、恢复全备数据(全备+增备合并后的数据)
    #关闭数据库
    /usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf stop 1
    #移除数据目录
    mv /data/mysql/ /data/mysql_bak/
    #重新创建MySQL数据目录
    mkdir -p /data/mysql/  
    #将全备数据(全备+增备)恢复到MySQL
    innobackupex --defaults-file=/usr/local/mysql/my.cnf  --user=root --socket=/tmp/mysql.sock --datadir=/data/mysql --copy-back /data/db_backup/xtrabackup/全备目录/
    #授权
    chown -R mysql.mysql /data/mysql
    #启动MySQL
    /usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf start 1

这里的增量备份之后,需要与全备份进行合并,之后每一次的备份都合并到全备份,保证全备份的完整性,最后恢复的时候就是把整个全备份恢复回去就可以了。【这个感觉还是要用脚本来执行才行,收工处理比较不现实】

这里的参考文章为:https://blog.csdn.net/sinat_29214327/article/details/81517233

后续还有使用Xtrabackup来做主从数据库复制的,但是,mysql本身就可以做这个的,不需要第三方的了。


主从复制

(╯‵□′)╯︵┻━┻ 这书,没有说具体的怎么实现的。。。。。(ノ`Д)ノ

主从复制的流程:

  • 主服务器[master]吧数据记录到binlog中
  • 从服务[slaave]获取主服务的binlog到自己的中继日志中【relay log】
  • 从服务器重做中继日志中的日志,把应用到数据库上。

然后就这样了,之后书的内容,就balabala的各种状态了,都没说怎么搭建(ノ`Д)ノ

主从复制具体操作

主从复制做主备数据库,Mysql本身就是支持的,改改配置,一个命令就可以了。:

1.主数据库配置:my.cnf
//主要就是开启binlog 就可以了
binlog_format           = MIXED                         //binlog日志格式,mysql默认采用statement,建议使用mixed
log-bin                 = /data/mysql/mysql-bin.log    //binlog日志文件
expire_logs_days        = 7                           //binlog过期清理时间
server-id			   = 101
binlog_do_db            = test 
//以下只是binlog的优化配置了  具体依据服务器性能调整
max_binlog_size         = 100m                       //binlog每个日志文件大小
binlog_cache_size       = 4m                        //binlog缓存大小
max_binlog_cache_size   = 512m                     //最大binlog缓存大小
#每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去
innodb_flush_log_at_trx_commit=1

binlog_do_db :指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。

binlog_ignore_db :指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。

其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可。

2.创建从库

这里的创建,是需要从主库全备份一个出来的。可以使用前边的mysqldump逻辑备份,也可以是Xtrabackup热备份。

在mysqldump中的–master-data 参数,如果是1,则在时候的连接主库的时候无需自定检查点,若为2,则需要手动配置同步binlog的文件和检查点。

Xtrabackup备份出来的,检查点信息是在备份目录下xtrabackup_checkpoints中。

创建,与主库一样版本的数据库,并恢复主库的全备份。

3.从数据库配置:my.cnf
server-id=100
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
#replicate-do-db=test

relay-log : 启动MySQL二进制日志,可以用来做数据备份和崩溃恢复,或主服务器挂掉了,将此从服务器作为其他从服务器的主服务器

replicate-do-db :指定同步的数据库,如果复制多个数据库,重复设置这个选项即可。若在master端不指定binlog-do-db:则在slave端可用replication-do-db来过滤。
replicate-ignore-db :不需要同步的数据库,如果有多个数据库,重复设置这个选项即可。
【其中需要注意的是,replicate-do-db和replicate-ignore-db为互斥选项,一般只需要一个即可。】

4.连接主数据库

在重启MySQL服务之后,就可以开始连接主数据库进行数据同步了。

在从数据库:

#进入mysql数据库
 mysql -uroot -p
 
#连接master主服务器
mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154;
#备注:
#master_host对应主服务器的IP地址。
#master_port对应主服务器的端口。
#master_log_file对应show master status显示的File列:master-bin.000001。
#master_log_pos对应show master status显示的Position列:154。

这里的master_log_file和master_log_pos 参数,如果是全备份–master-data = 1 的时候是不需要的,因为在binlog中已经有的(而且没有被注释掉)。

虽然不知道为什么,查到的这里推荐使用的参数为2,╮(╯_╰)╭ 我觉得自动的挺好的呀

5.启动slave数据同步
#启动slave数据同步
mysql> start slave;
 
#停止slave数据同步(若有需要)
mysql> stop slave;

其他命令

会用到的一些其他命令:

--查看主库状态
show master status;
--查看从库状态
show slave status

到这里,就算是配置完成了,至于多备库同步的情况,,,(⊙o⊙)… 不会 ╮(╯_╰)╭


其他

关于mysql.sock

在上面的的代码里面,比较的经常出现mysql.sock这个东东,而这个的作用就是连接数据库。

对mysql.sock来说,其作用是程序与mysqlserver处于同一台机器,发起本地连接时可用。并且这东东是啥端口ip都不用指定的。

-- 比如:
mysql -uroot -S /data/3309/mysql.sock < /server/backup/mysql_2016-07-07.sql
-- 这个SQL 就是直接执行了sql 文件了

这个就是服务本机,连接数据库服务的一个内部工具,恩 ,就这么理解就可以了。


小结一下

这篇主要就是主从数据同步的,结果书上还完全没有操作(ノ`Д)ノ,只能自己查了。。。。

除了主从复制之外,就是mysqldump,Xtrabackup这两个备份工具的介绍和使用了。其他的就没有了。

而关于主从复制之后的读写分离,是可以通过程序进行处理的,或者使用mycat来实现(我不会)。【再或者直接在MySQL用户权限上只给读权限】

2019-07-30 小杭

这个章节的内容,感觉写的不好啊,我想要的是理论并且加上具体操作的。

需要再找具体研究备份的书来系统学习 (ノ`Д)ノ


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章