服务器系统搭建的重要性与挑战,如何实现高效与安全的管理?
593
2022-05-30
XtraBackup 全备
1 开始备份时, 记录了重做日志的位置(log scanned up to 1099111111)
2 然后对 innodb引擎表的物理文件, 共享表空间和独立表空间进行 copy操作 (Copying ./xx/xx.ibd)
3 最后记录备份完成后的redo 日志位置 (transaction log of lsn(0,1099111111 ) 同(0,109922222)was copied)
XtraBackup 实现增量备份 (innodb引擎)
1 首先选一个全备, 记录当时的检查点的LSN
2 在进行增备时, 比较表空间中每个页的LSN 是否大于上次备份的LSN ,如果是 则备份该页, 同时记录当前检查点的LSN
1 兼容性检查:XBK只支持 MyISAM,InnoDB,CSV,MRG_MYISAM 四种存储引擎的表,其他存储引擎的表不会备份;通过查询tables,若非支持引擎,会打印warning, 表明Xtrabackup不会备份该表。 2 启动redo后台备份线程:从备份实例的最近一次checkpoint LSN的位置开始备份所有增量的redo log,一直持续到备份任务结束 3 加载所有的innodb表空间:打开并扫描所有innodb表的数据文件,检查所有表空间的第一个页面,初始化所有表的内存结构。 4 备份innodb表:遍历步骤3所构建的表的内存结构,备份每一个innodb表的数据文件,备份的过程中会检查每个页面的数据是否正确。 5 备份锁 LOCK TABLES FOR BACKUP影响小,加锁期间innodb表的DML操作不受影响,但是非innodb表的DML及DDL操作仍然是不允许的 6 备份完所有的表文件后,Xtrabackup需要获取binlog GTID信息 7 停止redo备份线程。 8 释放锁资源,备份结束
与FTWRL锁相比,备份锁 LOCK TABLES FOR BACKUP影响很小,加锁期间innodb表的DML操作不受影响,但是非innodb表的DML及DDL操作仍然是不允许的 lock tables for backup # 申请备份表锁 lock binlog for backup # 申请二进制日志锁 unlock binlog # 释放二进制日志锁 对于MySQL 5.x版本,Xtrabackup 2.4.x会执行 LOCK BINLOG FOR BACKUP 操作,对binlog加锁,然后获取GTID信息。 对于MySQL 8.0.x版本,Xtrabackup查询log_status时,MySQL服务器会分别对redo log, binlog等加轻量级锁,获取一致性的redo log LSN以及binlog的GTID;查询完备份一致点后,Xtrabackup会备份最后一个binlog文件,用于恢复时仲裁事务是否需要回滚;最后redo log备份线程任务会在其读取到的redo log的LSN大于查询到的备份一致性点的redo log LSN处停止
1全量备份 xtrabackup --defaults-file=/etc/my.cnf --host=ip --user=root --password=123 --port=3306 --backup --target-dir=/data/backup/full 或者:使用参数--datadir替换掉参数--defaults-file. # xtrabackup --host=ip--user=root --password=123 --port=3306 --datadir=/data/crm/ --backup --target-dir=/data/backup 增量备份: xtrabackup --defaults-file=/etc/my.cnf --host=ip --user=root --password=123 --port=3306 --backup --parallel=4 --target-dir=/data/backup/inc --incremental-basedir=/data/backup/full 2.恢复操作: 2.1 准备全备份的日志: xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full 2.2 准备增量备份的日志: xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full --incremental-dir=/data/backup/inc 2.3 全备份准备: # xtrabackup --prepare --target-dir=/data/backup/full 2.4 拷回数据: xtrabackup --copy-back --target-dir=/data/backup/full 2.5 修改数据目录的权限和属性: service mysqld stop chown -R mysql:mysql /data/bak1 chmod -R 755 /data/bak1
rm -rf /mydata/data/* rsync -azP /bakdir/fullback/* /mydata/data chown -R mysql.mysql /mydata/data/* 创建一个临时目录backupdir。 mkdir backupdir 解压文件。 xbstream -x -p 4 < ./全备文件.qp -C ./backupdir/ 5.6和5.7版本执行:innobackupex --parallel 4 --decompress ./backupdir 8.0版本执行:xtrabackup --parallel 4 --decompress --target-dir=./backupdir 删除“.qp”备份文件。 find ./backupdir/ -name '*.qp' | xargs rm -f 应用日志。 5.6和5.7版本执行:innobackupex --apply-log ./backupdir 8.0版本执行:xtrabackup --prepare --target-dir=./backupdir 停止MySQL数据库服务。 service mysql stop /bin/systemctl stop mysqld.service 备份原来的数据库目录。 mv /var/lib/mysql/data /var/lib/mysql/data_bak 创建新的数据库目录并修改目录权限。 mkdir /var/lib/mysql/data chown mysql:mysql /var/lib/mysql/data 拷贝全备文件,并修改目录权限。 5.6和5.7版本执行:innobackupex --defaults-file=/etc/my.cnf --copy-back ./backupdir 8.0版本执行:xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=./backupdir chown -R mysql:mysql /var/lib/mysql/data
xtrabackup的常用参数 基本命令: --defaults-file:指明服务器的配置文件,此参数必须作为innobackupex的第一个参数,否则报错 --host:指明主机 --user:指明备份的用户名 --password:指明备份用户名的密码 --backup:指明为备份,此参数可以忽略 /tmp/backup:备份的目录 --backup:指明为备份 --apply-log:指明为重做日志 --copy-back:指明为恢复 --slave-info:备份从库的show slave status信息,仅用于在备份从库时使用 --no-lock:不锁表,仅适用于存储引擎为innodb,并且不在乎备份位置点时使用 增量备份: --incremental:指明为增量备份 --incremental-basedir:指明此次的增量备份是基于之前的哪一次备份,增量备份仅适用于innodb和xtradb引擎 --redo-only:再次重做日志,用于增量备份的恢复过程中 --incremental-dir:恢复增量备份时,指明增量备份的目录 部分备份: --include:使用正则表达式备份匹配到的内容;例:备份mysql库中的user表,--include='^mysql[.]user' --table-files:如果要备份多个表,可以把多个表以”数据库名.表名“的方式写到文件中,备份时指定此文件 --databases:可以备份整个库,也可以备份库中的某个表,备份表时用”库名.表名“的方式 --export:使用部分备份恢复时用此选项,这和完整备份和增量备份有所区别 高级命令: xtrabackup在执行备份时,会等待获得全局锁,对于长时间执行的语句,会引发锁争用的问题! --lock-wait-timeout:指明执行flush tables with read lock前的等待时间,0表示不等待直接执行锁表命令,单位是s,若超过此参数设置的时间后还存在长时间执行的查询,则xtrabackup终止运行 --lock-wait-query-type:可以为all和update;若设置为all,表示等待所有类型的语句执行完成后再执行flush tables with read lock; 若设置update,则表示等待除了select之外sql语句执行完成,再执行锁表操作 --kill-long-queries-timeout:执行flush tables with read lock后等待的秒数 --kill-long-query-type:可以为all和select; 若为all,表示超过等待的秒数,强制终止所有的查询;若为select,表示强制终止select类型的查询
MySQL 数据库
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。