数据库备份方案:
备份方案 | 特点 |
---|---|
全量备份 | 全量备份就是指对某一个时间点上的所有数据或应用进行的一个完全拷贝。 数据恢复快。 备份时间长 |
增量备份 | 增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份 与前一次相比增加和者被修改的文件。这就意味着,第一次增量备份的对象 是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量 备份后所产生的增加和修改的文件,如此类推。 没有重复的备份数据 备份时间短 恢复数据时必须按一定的顺序进行 |
差异备份 | 备份上一次的完全备份后发生变化的所有文件。 差异备份是指在一次全备份后到进行差异备份的这段时间内 对那些增加或者修改文件的备份。在进行恢复时,我们只需对第一次全量备份和最后一次差异备份进行恢复。 |
//语法:
mysqldump [OPTIONS] database [tables ...]
mysqldump [OPTIONS] --all-databases [OPTIONS]
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
//常用的OPTIONS:
-uUSERNAME //指定数据库用户名
-hHOST //指定服务器主机,请使用ip地址
-pPASSWORD //指定数据库用户的密码
-P# //指定数据库监听的端口,这里的#需用实际的端口号代替,如-P3307
[root@localhost ~]# mysqldump -uroot -pruntime123! --all-databases > all-$(date '+%Y%m%d%H%M%S').sql
//后面备注年月日时间
[root@localhost ~]# vim all-20220630190213.sql
-- Current Database: `mysql`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `mysql`;
--
-- Table structure for table `columns_priv`
--
DROP TABLE IF EXISTS `columns_priv`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `columns_priv` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '',
`Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
//使用vim可以查看备份文件的结构
[root@localhost ~]# mysqldump -uroot -pruntime123! school tb_course > tb_course$(date '+%Y%m%d%H%M%S').sql
//备份表格
[root@localhost ~]# ls
all-20220630190213.sql anaconda-ks.cfg tb_course20220630190650.sql
[root@localhost ~]# mysqldump -uroot -pruntime123! --databases school > school$(date '+%Y%m%d%H%M%S').sql
[root@localhost ~]# ls
all-20220630190213.sql anaconda-ks.cfg school20220630191251.sql tb_course20220630190650.sql
mysql> drop database school;
Query OK, 2 rows affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
//删掉
恢复数据
[root@localhost ~]# mysql -uroot -pruntime123! < all-20220630190213.sql
//选定备份的整个数据库文件
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
修改MySQL配置文件(以往文章二进制安装MySQL提到过)
[root@localhost ~]# cat /etc/my.cnf
[mysqld]
datadir=/opt/data
socket=/tmp/mysql.sock
basedir=/usr/local/mysql
port=3306
character-set-server=utf8
log-error=/var/log/mysqld.log
pid-file=/opt/data/mysql.pid
server-id=1 # 设置服务器标识符;只能是数字
log-bin=mysql_bin # 开启二进制日志功能
[root@localhost ~]# service mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
差异备份所存放的位置
[root@localhost data]# ll
total 123000
-rw-r-----. 1 mysql mysql 56 Jun 28 14:04 auto.cnf
-rw-------. 1 mysql mysql 1676 Jun 28 14:04 ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 Jun 28 14:04 ca.pem
-rw-r--r--. 1 mysql mysql 1112 Jun 28 14:04 client-cert.pem
-rw-------. 1 mysql mysql 1680 Jun 28 14:04 client-key.pem
-rw-r----- 1 mysql mysql 808 Jun 30 19:29 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 Jun 30 19:30 ibdata1
-rw-r-----. 1 mysql mysql 50331648 Jun 30 19:30 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Jun 28 14:04 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Jun 30 19:30 ibtmp1
-rw-r-----. 1 mysql mysql 40686 Jun 30 19:30 mingzi.err
drwxr-x---. 2 mysql mysql 4096 Jun 30 19:17 mysql
-rw-r----- 1 mysql mysql 154 Jun 30 19:30 mysql_bin.000001
-rw-r----- 1 mysql mysql 19 Jun 30 19:30 mysql_bin.index
-rw-r----- 1 mysql mysql 5 Jun 30 19:30 mysql.pid
drwxr-x---. 2 mysql mysql 8192 Jun 28 14:04 performance_schema
-rw-------. 1 mysql mysql 1676 Jun 28 14:04 private_key.pem
-rw-r--r--. 1 mysql mysql 452 Jun 28 14:04 public_key.pem
drwxr-x--- 2 mysql mysql 118 Jun 30 19:25 school
-rw-r--r--. 1 mysql mysql 1112 Jun 28 14:04 server-cert.pem
-rw-------. 1 mysql mysql 1680 Jun 28 14:04 server-key.pem
drwxr-x---. 2 mysql mysql 8192 Jun 28 14:04 sys
//重启之后会多出我们所添加的文件
-rw-r----- 1 mysql mysql 154 Jun 30 19:30 mysql_bin.000001
-rw-r----- 1 mysql mysql 19 Jun 30 19:30 mysql_bin.index
差异备份 完全备份
[root@localhost ~]# mysqldump -uroot -pruntime123!. --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > all-$(date '+%Y%m%d%H%M%S').sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# ls
all-20220630190213.sql anaconda-ks.cfg tb_course20220630190650.sql
all-20220630194357.sql school20220630191251.sql
//all-20220630194357.sql 用时间来区别差异备份的文件
[root@localhost ~]# ll
total 1732
-rw-r--r-- 1 root root 877661 Jun 30 19:02 all-20220630190213.sql
-rw-r--r-- 1 root root 877813 Jun 30 19:43 all-20220630194357.sql
-rw-------. 1 root root 1092 May 23 13:13 anaconda-ks.cfg
-rw-r--r-- 1 root root 3240 Jun 30 19:12 school20220630191251.sql
-rw-r--r-- 1 root root 1981 Jun 30 19:06 tb_course20220630190650.sql
//或者用大小来区分
[root@localhost ~]# vimdiff all-20220630190213.sql all-20220630194357.sql
-- | --
|
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` | CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql`
|
USE `mysql`; | USE `mysql`;
+ +--309 lines: -----------------------------------|+ +--309 lines: -----------------------------------
-- | --
-- Dumping data for table `innodb_index_stats` | -- Dumping data for table `innodb_index_stats`
-- | --
|
LOCK TABLES `innodb_index_stats` WRITE; | LOCK TABLES `innodb_index_stats` WRITE;
/*!40000 ALTER TABLE `innodb_index_stats` DISABLE| /*!40000 ALTER TABLE `innodb_index_stats` DISABLE
INSERT INTO `innodb_index_stats` VALUES ('mysql',| INSERT INTO `innodb_index_stats` VALUES ('mysql',
/*!40000 ALTER TABLE `innodb_index_stats` ENABLE | /*!40000 ALTER TABLE `innodb_index_stats` ENABLE
UNLOCK TABLES; | UNLOCK TABLES;
|
all-20220630190213.sql 32,1 2% all-20220630194357.sql 31,0-1 3%
"all-20220630194357.sql" 1005L, 877813C
//也可以vimdiff
现在我们新增表里的内容模拟误删操作来恢复
mysql> create table info(id int not null primary key auto_increment,name varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert info(name) values('hd'),('ebd'),('mkx');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
//创建一张表格
mysql> select * from info;
+----+--------+
| id | name |
+----+--------+
| 1 | hd |
| 2 | ebd |
| 3 | mkx |
+----+--------+
3 rows in set (0.00 sec)
mysql差异备份恢复
模拟误删数据
mysql> drop database school;
Query OK, 3 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>
//删除school库
下面进行恢复
[root@localhost data]# ll
-rw-r----- 1 mysql mysql 1147 Jun 30 20:54 mysql_bin.000002
-rw-r----- 1 mysql mysql 19 Jun 30 20:43 mysql_bin.index
//此时可以看到我们二进制日志文件变动成000002 这里面保存这刚才对数据库的一系列操作,包括删除的操作
刷新创建新的二进制日志
[root@localhost ~]# mysqladmin -uroot -pruntime123! flush-logs
-rw-r----- 1 mysql mysql 1194 Jun 30 21:01 mysql_bin.000002
-rw-r----- 1 mysql mysql 154 Jun 30 21:01 mysql_bin.000003
//此时在观察这里的文件变成00003和00002
恢复完全备份
[root@localhost ~]# mysql -uroot -pruntime123! < all-20220630194357.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
//选择差异备份的文件恢复
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
//可以看到恢复成功,但是只有2张表 新增的内容并没有
检查误操作在那个环节
mysql> show binlog events in 'mysql_bin.000002';
+------------------+------+----------------+-----------+-------------+----------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+----------------+-----------+-------------+----------------------------------------------------------------------------------------------+
| mysql_bin.000002 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.37-log, Binlog ver: 4 |
| mysql_bin.000002 | 123 | Previous_gtids | 1 | 154 | |
| mysql_bin.000002 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000002 | 219 | Query | 1 | 375 | use `school`; create table info(id int not null primary key auto_increment,name varchar(10)) |
| mysql_bin.000002 | 375 | Anonymous_Gtid | 1 | 440 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000002 | 440 | Query | 1 | 514 | BEGIN |
| mysql_bin.000002 | 514 | Table_map | 1 | 566 | table_id: 142 (school.info) |
| mysql_bin.000002 | 566 | Write_rows | 1 | 635 | table_id: 142 flags: STMT_END_F |
| mysql_bin.000002 | 635 | Xid | 1 | 666 | COMMIT /* xid=480 */ |
| mysql_bin.000002 | 666 | Anonymous_Gtid | 1 | 731 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000002 | 731 | Query | 1 | 805 | BEGIN |
| mysql_bin.000002 | 805 | Table_map | 1 | 875 | table_id: 141 (school.tb_students_info) |
| mysql_bin.000002 | 875 | Update_rows | 1 | 953 | table_id: 141 flags: STMT_END_F |
| mysql_bin.000002 | 953 | Xid | 1 | 984 | COMMIT /* xid=484 */ |
| mysql_bin.000002 | 984 | Anonymous_Gtid | 1 | 1049 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000002 | 1049 | Query | 1 | 1147 | drop database school |
| mysql_bin.000002 | 1147 | Rotate | 1 | 1194 | mysql_bin.000003;pos=4 |
+------------------+------+----------------+-----------+-------------+----------------------------------------------------------------------------------------------+
17 rows in set (0.00 sec)
xtrabackup | innobackupex [--defaults-file=#] [--backup | --prepare | --copy-back | --move-back] [OPTIONS]
安装
[root@localhost ~]# yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
[root@localhost ~]# yum install -y percona-xtrabackup-24
备份的类型
1、根据是否需要数据库离线
冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行;
温备(warm backup): 服务在线,但仅支持读请求,不允许写请求;
热备(hot backup):备份的同时,业务不受影响。
注:
1、这种类型的备份,取决于业务的需求,而不是备份工具
2、MyISAM不支持热备,InnoDB支持热备,但是需要专门的工具
2、根据要备份的数据集合的范围
完全备份:full backup,备份全部字符集。
增量备份: incremental backup 上次完全备份或增量备份以来改变了的数据,不能单独使用,要借助完全备份,备份的频率取决于数据的更新频率。
差异备份:differential backup 上次完全备份以来改变了的数据。
建议的恢复策略:
完全+增量+二进制日志
完全+差异+二进制日志
3、根据备份数据或文件
物理备份:直接备份数据文件
优点:
备份和恢复操作都比较简单,能够跨mysql的版本,
恢复速度快,属于文件系统级别的
建议:
不要假设备份一定可用,要测试
mysql>check tables;检测表是否可用
逻辑备份: 备份表中的数据和代码
优点:
恢复简单、
备份的结果为ASCII文件,可以编辑
与存储引擎无关
可以通过网络备份和恢复
缺点:
备份或恢复都需要mysql服务器进程参与
备份结果占据更多的空间,
浮点数可能会丢失精度
还原之后,缩影需要重建