在生产环境中,数据的安全性是至关重要的,任何数据的丢失都可能产生严重的后果
程序错误
人为错误(大部分原因)
计算机失败
磁盘失败
灾难(如火灾,地震)和偷窃
物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
数据库在物理层面分成了三类文件,每一个文件的名字以表的名字开始,扩展名指出文件类型
表结构文件:.frm文件存储表定义
表数据文件的扩展名为.MYD( MYData)
表索引文件的扩展名是.MYI( MYIndex)
物理备份又可以分为脱机备份(冷备份)和联机备份(热备份)
冷备份:是在关闭数据库的时候进行的
热备份:数据库处于运行状态,这种备份方法依赖于数据库的日志文件
逻辑备份:对数据库逻辑组件(如表等数据库对象)的备份
完全备份:每次对数据进行完整的备份
差异备份:备份那些自从上次完全备份之后被修改过的文件
增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份
完全备份是对整个数据库的备份、数据库结构和文件结构的备份
完全备份保存的是备份完成时刻的数据库
完全备份是增量备份的基础
优点:
安全性高
备份与恢复操作简单方便
缺点:
数据存在大量的重复
占用大量的备份空间,空间利用率低
备份与恢复时间长
直接备份文件
[root@5centos mysql]# tar jcvf /beifen/bk-$(date +%F).tar.gz data
[root@5centos mysql]# ls /beifen/
bk-2020-08-20.tar.gz bk-.tar.gz
使用 mysqldump
备份单个库(实际上是备份库里的所有表)
[root@5centos /]# mysqldump -u root -p LIU > /beifen/JUEJUE.sql
Enter password:
多库备份
[root@5centos beifen]# mysqldump -u root -p --databases LIU PAN > /beifen/databases-LIU_PAN.sql
Enter password:
[root@5centos beifen]# ls
databases-LIU_PAN.sql JUEJUE.sql
备份所有库
[root@5centos beifen]# mysqldump -u root -p --opt --all-databases > /beifen/all_databases.sql
Enter password:
备份指定表
[root@5centos beifen]# mysqldump -u root -p LIU SHUSHU > /beifen/LIU-SHUSHU.sql
Enter password:
恢复数据库
恢复数据库有两种方法
一 source
二 mysql -u 用户名 -p < 备份脚本
mysql -u root -p mysql < /beifen/JUEJUE.sql
只有那些在上次完全备份或者增量备份后被修改的文件才会被备份
增量备份就是备份自上一次备份之后增加或变化的文件或者内容
优点:
没有重复数据,效率高,空间利用率最大化
备份量不大,时间短
缺点:
恢复麻烦:需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复
安全性较低
MySQL的配置文件的[mysqld]项中加入log-bin=filepath项(filepath是二进制文件的路径),如log-bin=mysql-bin,然后重启mysqld服务。
二进制日志文件的默认路径为/usr/local/mysql/data
MySQL二进制日志对备份的意义
二进制日志保存了所有更新或者可能更新数据库的操作
二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件
只需定时执行flush logs方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份
[root@5centos data]# systemctl stop mysqld
tar zcvf /beifen/mysql-$(date +%F).tar.gz /usr/local/mysql/data/
[root@5centos data]# systemctl start mysqld
[root@5centos data]# vim /etc/my.cnf
[mysqld]
……省略部分……
log-bin=mysql-bin
[root@5centos data]# systemctl restart mysqld
[root@5centos data]# ll
总用量 122928
……省略部分……发现已生成二进制文件
-rw-r-----. 1 mysql mysql 154 8月 22 22:47 mysql-bin.000001
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| JUEJUE |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use JUEJUE;
Database changed
mysql> show tables;
+------------------+
| Tables_in_JUEJUE |
+------------------+
| LIULIU |
+------------------+
1 row in set (0.00 sec)
mysql> select * from LIULIU;
+----+------+-------+
| ID | NAME | HIGHT |
+----+------+-------+
| 1 | JIAN | 175.0 |
| 2 | HAO | 174.0 |
+----+------+-------+
2 rows in set (0.00 sec)
进行完整备份
[root@5centos data]# mysqldump -u root -p JUEJUE > /beifen/JUEJUE.sql
Enter password:
增量备份
[root@5centos data]# mysqladmin -u root -p flush-logs;
Enter password:
查看增量日志文件
[root@5centos data]# ls
mysql-bin.000001 mysql-bin.000002
mysql> insert into LIULIU values (4,'GU',190);
Query OK, 1 row affected (0.01 sec)
mysql> insert into LIULIU values (5,'cai',180);
Query OK, 1 row affected (0.00 sec)
mysql> insert into LIULIU values (3,'SHA',180);
Query OK, 1 row affected (0.00 sec)
[root@5centos data]# mysqladmin -u root -p flush-logs;
Enter password:
[root@5centos data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000003 > /beifen/bk03.txt
[root@5centos data]# vim /beifen/bk03.txt
##最后一条执行
# at 625
#200822 23:54:34 server id 1 end_log_pos 673 CRC32 0xd27d03dd Write_rows: table id 108 flags: STMT_END_F
### INSERT INTO `JUEJUE`.`LIULIU`
### SET
### @1=5
### @2='cai'
### @3=180.0
mysql> drop table LIULIU;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
Empty set (0.00 sec)
基于时间
[root@5centos data]# mysqlbinlog --no-defaults --stop-datetime='2020-8-22 23;54:34' /usr/local/mysql/data/mysql-bin.000003 | mysql -u root -p
Enter password:
+----+------+-------+
| ID | NAME | HIGHT |
+----+------+-------+
| 1 | JIAN | 175.0 |
| 2 | HAO | 174.0 |
| 4 | GU | 190.0 |
| 5 | cai | 180.0 |
+----+------+-------+
如果想恢复特定的,恢复时开始和结束时间分开写就行
基于位置
我这又删了,不掩饰了
[root@5centos data]# mysqlbinlog --no-defaults --stop-position='625' /usr/local/mysql/data/mysql-bin.000003 | mysql -u root -p123123
+----+------+-------+
| ID | NAME | HIGHT |
+----+------+-------+
| 1 | JIAN | 175.0 |
| 2 | HAO | 174.0 |
| 4 | GU | 190.0 |
| 5 | cai | 180.0 |
+----+------+-------+