热备份—> 备份时,数据库读写操作均不受影响
温备份—> 备份时,数据库可读不可写
冷备份—> 备份时,数据库不可读不可写,数据库要下线
注:进行备份时,需要考虑数据库存储引擎是否支持此操作
MyISAM 不支持热备份
InnoDB 支持热备,温备,冷备
物理备份—> 通过tar,cp等命令打包复制数据库的数据文件达到备份的效果
逻辑备份—> 通过特定工具从数据库中导出数据并另存备份,会丢失数据的精确度;备份的是建表,建库,插入等操作执行的sql语句,适用于中小型数据库,效率相对较低;
优点
缺点
(1)直接cp,tar复制数据库文件
数据量小
(2)mysqldump+复制BIN LOGS
数据量中等,可以进行完全备份,定期备份
(3)lvm2快照+复制BIN LOGS
数据量一般,而不过分影响业务运行
(4)xtrabackup
数据量大,而不过分影响业务运行,定期增量备份或差异备份
注:以上几种方案分别针对不同场景
准备备份内容
# (1) 备份指定库,表
# 备份上图中的test库
[root@mysql-server ~]# mysqldump -uroot -pABC123.com --single-transaction --master-data=2 test > /tmp/test_`date +%F`.sql
# 备份及压缩
[root@mysql-server ~]# mysqldump -uroot -pABC123.com --single-transaction --master-data=2 test | gzip > /tmp/test_`date +%F`.gz
mysqldump: [Warning] Using a password on the command line interface can be insecure.
# 查看
[root@mysql-server ~]# ll /tmp/test_2020-08-03.*
-rw-r--r--. 1 root root 798 8月 3 15:29 /tmp/test_2020-08-03.gz
-rw-r--r--. 1 root root 2020 8月 3 15:26 /tmp/test_2020-08-03.sql
# (2) 全量备份,备份时刷新日志文件
[root@mysql-server ~]# mkdir /backup
[root@mysql-server ~]# mysqldump -uroot -pABC123.com --routines --events --triggers --master-data=2 --flush-logs --all-databases > /backup/all_`date +%F`.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@mysql-server ~]# ll /backup/
总用量 1016
-rw-r--r--. 1 root root 1037139 8月 3 15:32 all_2020-08-03.sql
# 先创建一个库
[root@mysql-server ~]# mysql -uroot -pABC123.com -e 'create database test1'
mysql: [Warning] Using a password on the command line interface can be insecure.
# 将刚才备份的test数据库内容导入test1中
[root@mysql-server ~]# mysql -uroot -pABC123.com test1 < /tmp/test_2020-08-03.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
前提条件:my.cnf(数据库配置文件)中要开启mysql log-bin日志功能
在数据库配置文件中的[msyqld]中插入
log-bin=mysql-bin #可以加路径,但是目录要真实存在。
重启mysql
查看数据库是否开启了二进制日志打印功能;
此时显示开启;
(1)指定开始时间到结束时间
myslbinlog mysqlbin.000011 --start-datetime='2020-08-04 00:02:24' stop-datetime='020-08-04 00:39:22' time.sql
(2)指定开始时间到文件结束
myslbinlog mysqlbin.000011 --start-datetime='2020-08-04 00:02:24' esen -r time.sql
(3)从文件开头到指定结束时间
myslbinlog mysqlbin.000011 --stop-datetime='2020-08-04 00:39:22' esen -r time.sql
(1)指定开始位置到结束位置
myslbinlog mysqlbin.000011 --start-position=4 --stop-position=558 -r pos.
(2)指定开始位置到文件结束
myslbinlog mysqlbin.000011 --start-position=4 -r pos.sql
(3)从文件开始位置到指定结束位置
myslbinlog mysqlbin.000011 --stop-position=558 -r pos.sql
[root@mysql-server ~]# mysqldump -uroot -pABC123.com --default-character-set=gbk --single-transaction -F -B test1 |gzip > /backup/test1_`date +%F`.sql.gz
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@mysql-server ~]# date -s '20200804'
2020年 08月 04日 星期二 00:00:00 CST
[root@mysql-server ~]# mysqldump -uroot -pABC123.com --default-character-set=utf8 --single-transaction -F -B test2 | gzip > /backup/test2_`date +%F`.sql.gz
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysql> insert into test2_1 values
-> (55,"zhangsanfeng",100),
-> (66,"zhangwuji",101);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> drop database test2;
Query OK, 1 row affected (0.03 sec)
注:需要锁定数据库
a. 检查凌晨备份
[root@mysql-server ~]# ll /backup/test2_2020-08-04.sql.gz
-rw-r--r--. 1 root root 815 8月 4 00:02 /backup/test2_2020-08-04.sql.gz
b. 检查全备后的binlog
[root@mysql-server ~]# ll /var/lib/mysql/mysql-bin.*
-rw-r-----. 1 mysql mysql 179 7月 21 12:20 /var/lib/mysql/mysql-bin.000001
-rw-r-----. 1 mysql mysql 492 7月 22 14:30 /var/lib/mysql/mysql-bin.000002
-rw-r-----. 1 mysql mysql 156 7月 22 15:17 /var/lib/mysql/mysql-bin.000003
-rw-r-----. 1 mysql mysql 179 7月 22 15:44 /var/lib/mysql/mysql-bin.000004
-rw-r-----. 1 mysql mysql 203 7月 22 16:43 /var/lib/mysql/mysql-bin.000005
-rw-r-----. 1 mysql mysql 1048 8月 3 00:40 /var/lib/mysql/mysql-bin.000006
-rw-r-----. 1 mysql mysql 930 8月 3 15:32 /var/lib/mysql/mysql-bin.000007
-rw-r-----. 1 mysql mysql 1800 8月 3 15:45 /var/lib/mysql/mysql-bin.000008
-rw-r-----. 1 mysql mysql 1119 8月 4 00:01 /var/lib/mysql/mysql-bin.000009
-rw-r-----. 1 mysql mysql 358 8月 4 00:02 /var/lib/mysql/mysql-bin.000010
-rw-r-----. 1 mysql mysql 665 8月 4 00:39 /var/lib/mysql/mysql-bin.000011
c. 立即刷新并备份出binlog
[root@mysql-server ~]# mysqladmin -uroot -pABC123.com flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@mysql-server ~]# cp /var/lib/mysql/mysq-bin.* /root/mysql-bin
注:根据时间点及前一个binlog可以知道发现问题时刻前binlog日志
d. 检查二进制日志中可能出现的问题,恢复binlog生成sql语句
[root@mysql-server mysql-bin]# mysqlbinlog mysql-bin.000010 >> bin.log
[root@mysql-server mysql-bin]# mysqlbinlog mysql-bin.000011 >> bin.log
[root@mysql-server mysql-bin]# mysqlbinlog mysql-bin.000012 >> bin.log
注:检查为mysql-bin.000011日志中出现的问题
e. 恢复凌晨备份
[root@mysql-server mysql-bin]# cd /backup/
[root@mysql-server backup]# ls
all_2020-08-03.sql test1_2020-08-03.sql.gz test2_2020-08-04.sql.gz
[root@mysql-server backup]# gunzip test2_2020-08-04.sql.gz
[root@mysql-server backup]# ls
all_2020-08-03.sql test1_2020-08-03.sql.gz test2_2020-08-04.sql
[root@mysql-server backup]# mysql -uroot -pABC123.com -e 'create database test3'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@mysql-server backup]# mysql -uroot -pABC123.com test3 < test2_2020-08-04.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
f. 恢复增量备份
[root@mysql-server mysql-bin]# mysqlbinlog mysql-bin.000010 > test3.sql
[root@mysql-server mysql-bin]# mysql -uroot -pABC123.com < test3.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
注:上面为分步恢复;也可以如下,将二进制日志文件导入一个文件后恢复
先找出凌晨时刻的二进制日志文件,然后找出出问题时刻的二进制文件
注:此次找到问题出处为 mysql-bin.000009
# 单库
[root@mysql-server mysql-bin]# mysqlbinlog -d test2 mysql-bin.000009 --start-position=344 > test2-bin.sql
[root@mysql-server mysql-bin]# mysqlbinlog -d test2 mysql-bin.000009 --start-position=233 > test2-bin.sql
[root@mysql-server mysql-bin]# mysqlbinlog -d test2 mysql-bin.000010 >> test2-bin.sql
WARNING: The option --database has been used. It may filter parts of transactions, but will include the GTIDs in any case. If you want to exclude or include transactions, you should use the options --exclude-gtids or --include-gtids, respectively, instead.
[root@mysql-server mysql-bin]# mysql -uroot -pABC123.com test3 < test2-bin.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1007 (HY000) at line 24: Can't create database 'test2'; database exists
# 此时报错,因为我们刚才恢复了test2库,现在再次删掉即可
mysql> drop database test2;
Query OK, 1 row affected (0.02 sec)
[root@mysql-server mysql-bin]# mysql -uroot -pABC123.com test3 < test2-bin.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
# 再次删除test2数据库
mysql> drop database test2;
Query OK, 1 row affected (0.01 sec)
[root@mysql-server mysql-bin]# mysqlbinlog mysql-bin.000011 > 11.sql
[root@mysql-server mysql-bin]# vim 11.sql
# 删除刚才指其中的drop database test2;
[root@mysql-server mysql-bin]# mysql -uroot -p < test2-bin.sql
Enter password:
使用脚本实现自动化备份
[root@mysql-server ~]# vim mysql_back.sh
#!/bin/bash
back_dir=/backup/
back_file=`date +%F`_all.sql
user=root
pass=ABC123.com
if [ ! -d /backup ]
then
mkdir -p /backup
fi
# 备份并截断日志
mysqldump -u$user -p$pass --lock-all-tables --routines --events --triggers --master-data=2 --flush-logs --all-databases > $back_dir$back_file
# 只保留最近一个月的备份
find $back_dir -mtime +30 -exec rm -rf {} \;
[root@mysql-server ~]# chmod a+x mysql_back.sh
[root@mysql-server ~]# chattr +i mysql_back.sh
[root@mysql-server ~]# sh mysql_back.sh
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@mysql-server ~]# ll /backup/
总用量 1016
-rw-r--r--. 1 root root 1039014 8月 4 02:11 2020-08-04_all.sql
[root@mysql-server ~]# crontab -e
# everyday backup all databases of mysql
0 2 * * * ./etc/profile;sh /root/mysql_back.sh
cp ;tar
注:此种方法只能用于同种安装方式的mysql服务器
[root@mysql-server ~]# systemctl stop mysqld
[root@mysql-server ~]# netstat -tunalp |grep 3306
[root@mysql-server ~]#
[root@mysql-server ~]# cd /var/lib/mysql
[root@mysql-server mysql]# mkdir -p /server/backup
[root@mysql-server mysql]# tar czf /server/backup/all.`date +%F`.tar.gz *
[root@mysql-server mysql]# scp -p /server/backup/all.2020-08-04.tar.gz 192.168.10.102:/tmp
[root@server02 ~]# systemctl stop mysqld
[root@mysql01 ~]# tar xf /tmp/all.2020-08-04.tar.gz -C /var/lib/mysql/
[root@server02 ~]# chown -R mysql:mysql /usr/local/mysql/data/
[root@mysql01 ~]# systemctl start mysqld
------------------------------------------------------------------------------------------------------- 返回目录