在生产环境中,数据的安全性至关重要
任何数据的丢失都可能产生严重的后果
造成数据丢失的原因
程序错误
人为操作错误
运算错误磁盘故障
灾难(如火灾、地震)和盗窃
物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
物理备份方法
冷备份(脱机备份)∶是在关闭数据库的时候进行的
热备份(联机备份)︰数据库处于运行状态,依赖于数据库的日志文件。
温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作
逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份
完全备份:每次对数据库进行完整的备份
差异备份:备份自从上次完全备份之后被修改过的文件
增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份
通过上面的概念分析可以知道,差异备份与增量备份的区别在于它们备份的参考点不同:前者的参考点是上一次完全备份、差异备份或增量备份,后者的参考点是上一次完全备份。
下图展示了差异备份与增量备份的区别,其中Cumulative为差异备份,Differetial增量备份:
以每周数据备份计划为例,我们可以在星期一进行完全备份,在星期二至星期五进行差异备份。如果在星期五数据被破坏了,则只需要还原星期一完全的备份和星期四的差异备份。这种策略备份数据需要较多的时间,但还原数据使用较少的时间。
以每周数据备份为例,在星期一进行完全备份,在星期二至星期五进行增量备份。如果在星期五数据被破坏了,则你需要还原星期一正常的备份和从星期二至星期五的所有增量备份。这种策略备份数据需要较少的时间,但还原数据使用较多的时间。
·备份时数据库处于关闭状态,直接打包数据库文件备份速度快,恢复时也是最简单的T
mydump或mysqlhotcopymysqldump常用的逻辑备份工具
mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表
·进行增量备份,需要刷新二进制日志第三方工具备份
Percona XtraBackup
关闭MySQL数据库
使用tar命令直接打包数据库文件夹
直接替换现有MySQL目录即可
MySQL自带的备份工具可方便实现对MySQL的备份
可以将指定的库、表导出为SQL脚本
使用命令mysql导入备份的数据
MySQL 的日志默认保存位置为 /usr/local/mysql/data
达到事务一致性(每次重启会重做)
作用:确保日志的持久性,防止在发生故障,脏页未写入磁盘。重启数据库会进行redo log执行重做,达到事务一致性
作用:保证数据的原子性,记录事务发生之前的一个版本,用于回滚,innodb事务可重复读和读取已提交 隔离级别就是通过mvcc+undo实现
作用:Mysql本身启动,停止,运行期间发生的错误信息
作用:记录执行时间过长的sql,时间阈值(10s)可以配置,只记录执行成功
另一个作用:在于提醒优化
作用:用于主从复制,实现主从同步
记录的内容是:数据库中执行的sql语句
作用:用于数据库主从同步,将主库发来的bin log保存在本地,然后从库进行回放
作用:记录数据库的操作明细,默认关闭,开启后会降低数据库性能
show variables like 'general%'; #查看通用查询日志是否开启
show variables like 'log_bin%'; #查看二进制日志是否开启
show variables like '%slow%'; #查看慢查询日功能是否开启
(root@localhost) [class]> show variables like 'long_query_time'; #查看慢查询时间设置
[root@localhost data]# vim /etc/my.cnf
log-error=/usr/local/mysql/data/mysql_error.log #指定日志的保存位置和文件名
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log #通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的
log-bin=mysql-bin #二进制日志(binlog),用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启
slow_query_log=ON #慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便提醒优化,默认是关闭的
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5 #设置超过5秒执行的语句被记录,缺省时为10秒
binlog_format = MIXED
[root@localhost data]# systemctl restart mysqld
[root@localhost ~]# systemctl stop mysqld #先停用数据库
[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# mkdir /back
[root@localhost ~]# tar zcf /back/mysql_all_$(date +F%).tar.gz /usr/local/mysql/data
[root@localhost ~]# mv /usr/local/mysql/data /usr/local/mysql/data.bak 把原data做备份
[root@localhost ~]# cd /back
[root@localhost back]# tar zxf mysql_all_2021-11-29.tar.gz 解压该文件
[root@localhost mysql]# cp -ra data /usr/local/mysql/data 这里要用-p或者-a
或者
[root@localhost mysql]# mv data /usr/local/mysql/data
[root@localhost mysql]# systemctl restart mysqld.service
mysqldump -uroot -p[密码] – databases 库名1 [库名2] … > /备份路径/备份文件名.sql #导出的就是数据库脚本文件
[root@localhost mysql]# mysqldump -uroot -pzy44123 -- databases class > /back/class.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# cd /back/
[root@localhost back]# ls
[root@localhost ~]# mysqldump -uroot -pzy44123 --databases class mysql > /back/class_mysql.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump -u root -p[密码] – all-databases > /备份路径/备份文件名.sql
[root@localhost ~]# mysqdump -uroot -pzy44123 --all-databases > /back/mysql_all.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
[root@localhost back]# mysqldump -uroot -pzy44123 class cy > /back/class_cy.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
#使用“-d”选项,说明只保存数据库的表结构
#不使用“-d"选项,说明表数据也进行备份
#做为一个表结构模板
[root@localhost back]# cat /back/class_cy.sql |grep -v "^--" | grep -v "^/" | grep -v "^$"
[root@localhost ~]# mysql -uroot -pzy44123 < /back/class_mysql.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
当备份文件只有表格时,你要指定数据库,没有需要新建数据库,否则会报错
[root@localhost ~]# mysql -uroot -pzy44123 class
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1049 (42000): Unknown database 'class'
[root@localhost back]# mysql -uroot -pzy44123 class < /back/class_cy-d.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
将所有备份的二进制日志内容全部恢复
数据库在某一时间点可能既有错误的操作也有正确的操作
可以基于精准的位置跳过错误的操作
发生错误节点之前的一个节点,上一次正确操作的位置点停止
跳过某个发生错误的时间点实现数据恢复
在错误时间点停止,在下一个正确时间点开始
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED #可选,指定二进制日志(binlog)的记录格式为MIXED(混合输入)
server-id = 1 #可加可不加该命令
#二进制日志(binlog)有3种不同的记录格式:
#STATEMENT (基于SQL语句)、
#ROW(基于行)、
#MIXED(混合模式),
#默认格式是STATEMENT
[root@localhost data]# systemctl restart mysqld 重启服务
mysqldump -uroot -pzy44123 class cy >/backup/class_cy.sql
[root@localhost data]# mysqldump -uroot -pzy44123 --all-databases > /backup/mysql_all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqladmin -uroot -pzy44123 flush-logs
insert into cy values(5,'test')
mysqladmin -uroot -pzy4123 flush-logs
#之前的操作会保存在上一个二进制文件中,之后的操作会保存在新的二进制文件中
cp /usr/loacal/mysql/data/mysql-bin.000001 /back
[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysqlbk-bin.000001
先看下正在写的是那个文件
然后查找上一个文件看有没有你要的内容
(root@localhost) [class]> show binlog events in 'mysqlbk-bin.000001'\G
(root@localhost) [class]> DROP TABLE cy; 先在数据库中模拟丢失数据
Query OK, 0 rows affected (0.00 sec)
mysqlbinlog --no-defaults /back/mysql-bin.000001|mysql -u -root -pzy44123 找回数据
如果不从完备恢复,那么数据就是先找到你要恢复数据的断点位置
[root@localhost ~]# mysqlbinlog --no-defaults /usr/local/mysql/data/mysqlbk-bin.000001
[root@localhost ~]# mysqlbinlog --no-defaults --start-position=790839 /usr/local/mysql/data/mysqlbk-bin.000001 |mysql -uroot -pzy44123
mysql: [Warning] Using a password on the command line interface can be insecure.
按时间节点恢复
[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysqlbk-bin.000007
[root@localhost data]# mysqlbinlog --no-defaults --start-datetime='2021-11-30 19:15:16' /usr/local/mysql/data/mysqlbk-bin.000007 |mysql -uroot -pzy44123
mysql: [Warning] Using a password on the command line interface can be insecure.