参考文章:https://www.cnblogs.com/f-ck-need-u/p/9018716.html
mariadb数据库的备份与恢复
备份的状态:热备、冷备、温备。
热备和温备需要锁定要备份的数据库的读,否则会引起脏读等现象
冷备一般在数据库主备的备服务器上使用。
备份的方法:mysqldump/lvm/xtrabackup
musqldump:热备innodb、温备myisam,基于逻辑实现.处理较大数据文件能力弱。
lvm: 几乎热备,物理实现。导出前需锁定数据库——复制文件——解锁数据库。
xtrabackup:支持热备(物理)、温备。
备份的方式:完全备份,增量备份,差异备份。
生产中需编写定时脚本,每周完全备份一次,每天增量备份一次。数据库文件和二进制日志和配置文件及脚本函数存放本地、云端、其他存储服务器(有冗余能力raid10)
xtrabackup是上述备份工具中性能较为优越的
安装xtrabackup,https://www.percona.com/downloads/XtraBackup/LATEST/
innobackupex工具是基于c语言编写的xtrabackup轻量级使用工具
备份前的准备工作:
[root@localhost mysql]# vim /etc/my.cnf #也可在mysql的其它配置文件中配置,范围越小,越先生效[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log_bin=ON #此处增加
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
skip_name_resolve=ON
innodb_file_per_table=ON
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
log_bin=ON 此处ON为mysql默认位置也可自定义位置如log_bin=/data/mysql/log/server
此路径需属主属组为mysql.mysql
chown -R mysql:mysql /data/mysql/log
ll /data/mysql/log
[root@localhost mysql]# systemctl restart mariadb
[root@localhost mysql]# mysql -uroot -p123456
MariaDB [(none)]> show master logs;
+-----------+-----------+
| Log_name | File_size |
+-----------+-----------+
| ON.000001 | 245 |
+-----------+-----------+
1 row in set (0.00 sec)
MariaDB [(none)]> show master status;
+-----------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------+----------+--------------+------------------+
| ON.000001 | 245 | | |
+-----------+----------+--------------+------------------+
1 row in set (0.00 sec)
开启innobackupex备份:
innobackupex --user=dbusername --password=dbpasswd /path/to/bakdir 备份文件存放位置
[root@localhost mysql]# innobackupex --user=root --password=123456 /var/lib/mysql/bakdir/
[root@localhost mysql]# du -sh bakdir/2019-08-01_21-58-40/*
4.0K bakdir/2019-08-01_21-58-40/backup-my.cnf
0 bakdir/2019-08-01_21-58-40/bakdir
112K bakdir/2019-08-01_21-58-40/hidb
4.0K bakdir/2019-08-01_21-58-40/HIDB
18M bakdir/2019-08-01_21-58-40/ibdata1
112K bakdir/2019-08-01_21-58-40/mydb
1000K bakdir/2019-08-01_21-58-40/mysql
212K bakdir/2019-08-01_21-58-40/performance_schema
0 bakdir/2019-08-01_21-58-40/test
4.0K bakdir/2019-08-01_21-58-40/test2
1.8M bakdir/2019-08-01_21-58-40/wordpress
4.0K bakdir/2019-08-01_21-58-40/xtrabackup_binlog_info
4.0K bakdir/2019-08-01_21-58-40/xtrabackup_checkpoints
4.0K bakdir/2019-08-01_21-58-40/xtrabackup_info
4.0K bakdir/2019-08-01_21-58-40/xtrabackup_logfile
xtrabackup会生成几个文件:
backup-my.cnf 当前配置文件的部分拷贝,只包含[mysqld]配置片段和备份有关的选项
xtrabackup_binlog_info中记录的是当前使用的二进制日志文件
ON.000001 245
xtrabackup_checkpoints中记录了备份的类型是全备还是增备,还有备份的起始、终止LSN号
backup_type = full-backuped
from_lsn = 0
to_lsn = 2880061
last_lsn = 2880061
compact = 0
recover_binlog_info = 0
flushed_lsn = 2880061
xtrabackup_info中记录了本次备份的基础信息
uuid = 7bc47b21-b464-11e9-a3bc-000c29de405f
name =
tool_name = innobackupex
tool_command = --user=root --password=... /var/lib/mysql/bakdir/
tool_version = 2.4.15
ibbackup_version = 2.4.15
server_version = 5.5.60-MariaDB
start_time = 2019-08-01 21:58:42
end_time = 2019-08-01 21:58:47
lock_time = 0
binlog_pos = filename 'ON.000001', position '245'
innodb_from_lsn = 0
innodb_to_lsn = 2880061
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N
xtrabackup_logfile是复制和监控后写的redo日志。该日志是备份后下一个操作"准备"的关键。只有通过它才能实现数据一致性。
备份之后并不能立刻开始恢复,因为备份时可能会有未提交或未完成的事务,xtrabackup在备份时会监控此类事务,在备份完成后读取此监控,该回滚的回滚,该前滚的前滚(innodb表)。此操作为--apply-log,xtrabackup的准备阶段。此操作不需开启数据库。
innobackupex --apply-log /var/lib/mysql/bakdir/2019-08-01_21-58-40/
.........
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 2886346
190801 23:03:35 completed OK!
在准备阶段,有一个内存使用量选项"--use-memory",该选项默认值为100M,值越大准备的过程越快。当然,将该值加大的前提是服务器内存够用。
innobackupex的全备份恢复
innobackupex全备份恢复要求目标主机的mariadb处于关闭状态,且其datadir文件夹必须为空!
systemctl stop mariadb
cat /etc/my.cnf 查看datadir路径
rm -rf /var/lib/mysql/*
innobackupex的恢复依靠--copy-back ,选项后指定恢复的源目录。
innobackupex --copy-back /tmp/backfile/2019-08-01_21-58-40/
190801 23:42:45 completed OK!
[root@localhost lib]# chown -R mysql:mysql mysql/ #更改datadir路径下文件属组属主为mysql:mysql
属主属组别忘了改!
恢复完成,进入数据库查看吧。
增量备份
xtrabackup增量备份是基于完全备份基础上实现的,通过比对全备份的终点LSN和当前的LSN实现:增备时将从终点LSN开始一直备份到当前的LSN。在备份时也有redo log的监控线程,对于增备过程中导致LSN增长的操作也会写入到日志中。
增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。
默认情况下,增备的起始LSN是自动获取的,但是在某些情况下无法获取,还有些情况下无法获取到将要增备的basedir。xtrabackup提供的选项"--incremental-lsn=N"可以显式指定增备的起始LSN,显式指定LSN时,可以无需提供增备的basedir。(建议)
[root@localhost mysql]# innobackupex --password=1223456 /backup/
#登录数据库修改数据,做第一次增量备份
[root@localhost mysql]# innobackupex --password=123456 --incremental /backup/ --incremental-basedir=/backup/2019-08-02_00-19-58/
[root@localhost mysql]# innobackupex --apply-log --redo-only /backup/2019-08-02_00-19-58
#整理全备份,回滚未提交的事务。
[root@localhost mysql]# cat /backup/2019-08-02_00-19-58/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 2883423
last_lsn = 2883423
compact = 0
recover_binlog_info = 0
flushed_lsn = 2883423
# 查看全备份结束lsn号:2883423
[root@localhost backup]# innobackupex --apply-log /backup/2019-08-02_01-02-03/ --incremental-dir /backup/2019-08-02_01-02-52/ #这里的日期是重做了一次的
[root@localhost backup]# innobackupex --apply-log /backup/2019-08-02_01-02-03 #整合所有备份 这一步可以不做,因为此前已经将最后一次增量整合到全备份中了。
[root@localhost backup]# innobackupex --copy-back /tmp/backfile/2019-08-02_01-02-03
--incremental-basedir指的是基于谁做的增量备份,INCREMENTAL-DIR指的是第一次增量备份的目录,--redo-only表示备份回滚事务,每一备份操作到最后一次增量备份之前的每一次备份都需要单独做一次,可以在全部备份完后做。
导入或导出单张表
(1)“导出”表
导出表是在备份的prepare阶段进行的,因此,一旦完全备份完成,就可以在prepare过程中通过--export选项将某表导出了:
innobackupex --apply-log --export /path/to/backup
此命令会为每个innodb表的表空间创建一个以.cfg和.exp再加上.ibd文件结尾的文件,这些文件则可以用于导入至其它服务器。
[root@localhost backup]# innobackupex --apply-log --export ./2019-08-02_01-02-03/
(2)“导入”表
要在mysql服务器上导入来自于其它服务器的某innodb表,需要先在当前服务器上创建一个跟原表表结构一致的表,而后才能实现将表导入:
mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;
然后将此表的表空间删除:
mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;
接下来,将来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp和myrable.cfg文件复制到当前服务器的数据目录,然后使用如下命令将其“导入”:
mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;