一、备份详解
备份形式:
热备份:数据库正常访问,读写正常,不影响使用
温备份:数据库访问受限,用户以只读的方式访问,不能修改数据,影响应用个别功能
冷备份:数据库不能访问,影响应用。
备份策略:
全量备份:备份数据库的所以数据
增量备份:仅备份上次全量备份或增量备份的后产生的新数据
差异备份:仅备份上次全量备份后产生的新数据
备份方式:
物理备份:备份数据的data 数据文件
逻辑备份:使用工具将表中的数据转换为sql或二进制(dmp)文件
二、常用备份工具
mysqldump 是MySQL数据库自带的逻辑备份工具,适用于数据量小于10G左右备份,如果数据量过大建议使用xtrabackup。
xtrabackup可以在不加锁的情况下备份innodb数据表,不过此工具不能操作myisam。
innobackupex是一个封装了xtrabackup的脚本,能同时处理innodb和myisam,但在处理myisam时需要加一个读锁。
三、mysqldump备份
mysqldump 是MySQL数据库自带的逻辑备份工具
备份所有数据库:
mysqldump -u root -p --all-databases >/opt/alldbbak.sql
备份指定库(--databases 多个数据前面加参数,库名与库名之间隔开):
mysqldump -u root -p db1 >/opt/db1.sql
--databases:转储输出将不包含 CREATE DATABASE 或USE语句。
如果不带--databases 恢复时必须先创建库
备份指定表(先写库名中间空格后面跟表名,多个表名空格分隔):
mysqldump -uroot -p db tables > /opt/db/tables.sql
mysqldump备份注意事项:
1、默认:mysql -h host -u name -p password dbname > /opt/db.sql 这种备份方式,在备份完成之前会把所有得表锁住,导致无法写入,需要在备份命令中 加入 --single-transaction 选项(仅对支持事务的表有效,比如
InnoDB,对非事务型的表比如
MyISAM则没有效果)
2、报错:mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table
解决:mysql -u name -p password --max_allowed_packet=512M dbname >/opt/dbname.sql
3、报错:mysqldump: Got error: 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) when trying to connect
解决:mysqldump --socket=/opt/mysql-5.7/mysql.sock -u root -p dbname >/opt/dbname.sql
四、xtrabackup工具备份
mysql 5.7
安装:
yum -y install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool zlib-devel libgcrypt-devel #安装依赖
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
yum localinstall percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
mysql 8.0
安装:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
常用参数说明:
--user= #指定数据库备份用户
--password= #指定数据库备份用户密码
--port= #指定数据库端口
--host= #指定备份主机
--socket= #指定socket文件路径
--databases= #备份指定数据库,多个空格隔开,不加备份所有库
--defaults-file= #指定my.cnf配置文件
--incremental= #增量备份,后跟增量备份路径
--incremental-basedir= #增量备份,指上次增量备份路径
--redo-only #合并全备和增量备份数据文件
--apply-log #日志回滚
--copy-back #将备份数据复制到数据库,数据库目录要为空
--move-back #这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本
--stream= #指定流的格式做备份,–stream=tar,将备份文件归档
全量备份:
innobackupex --socket=/opt/mysql/mysql.sock --user=root --password=123456 /opt/backup/
增量备份(第一次增量备份,要以全量备份为节点,进行备份,第二次增量备份,要以上一次增量备份为节点来进行第二次的增量备份):
innobackupex --socket=/opt/mysql/mysql.sock --user=root --password=123456 --incremental /opt/backup/ --incremental-basedir=/opt/backup/2022-07-12/
备份完成后查看一下备份文件下的 xtrabackup_checkpoints
from_lsn: 从哪个数据块开始备份,全量备份从0开始,增量备份从上一次备份的to_lsn 开始
to_lsn:备份到哪里
last_lsn:最后的数据块
恢复和流程注意事项:
1、先把mysql 关闭,清理data 数据目录
2、恢复注意使用的是--copy-back和--move-back,如果是--move-back,先把备份好的备份在备份一下,以免恢复失败也导致备份文件丢失
3、恢复后注意查看data的权限,属主,属组问题
全量恢复:
innobackupex --defaults-file=/etc/my.cnf --copy-back /opt/backup/2022-08-13_21-56-51/
增量恢复:
流程:
1、关闭mysql服务,清理data数据目录
/etc/init.d/mysqld stop
cd /opt/mysql/data
rm -rf ./*
2、使用–apply-log 和 --redo-only参数对全量备份进行备份操作(事物回滚)
innobackupex --apply-log --redo-only /opt/backup/2022-08-13_21-56-51/
3、将第一次增量备份合并到完全备份,使用–apply-log 和 --redo-only参数
innobackupex --apply-log --redo-only /opt/backup/2022-08-13_21-56-51/ --incremental-dir=/opt/backup/2022-08-13_22-02-29/ # --incremental-dir= 指定增量备份路径
4、查看全量备份的xtrabackup_checkpoints,发现此时last_lsn是第一次增量备份的last—lsn
cat /opt/backup/2022-08-13_21-56-51/xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 2762267
last_lsn = 2762276
compact = 0
recover_binlog_info = 05、将第最后一次增量备份应用到完全备份,使用–apply-log参数,不要加–redo-only参数。
innobackupex --apply-log /opt/backup/2022-08-13_21-56-51/ --incremental-dir=/opt/backup/2022-08-13_22-04-13/
6、再次查看全量备份的xtrabackup_checkpoints,当全量备份的last_lsn和最后一次增量备份的last—lsn一致时,把全量备份进行一次apply操作
innobackupex --apply-log /opt/backup/2022-08-13_21-56-51/
7、使用 --copy-back 参数恢复。
innobackupex --defaults-file=/etc/my.cnf --copy-back /opt/backup/2022-08-13_21-56-51/
8、启动数据库查看数据,恢复完毕