数据库应用——MySQL备份与恢复

                                                      MySQL备份与恢复

一、备份方式
1、数据库备份的重要性
(1)提高系统高可用性和灾难可恢复性
(2)备份和还原数据库,是数据库崩溃时提供数据恢复最小代价的最优方案
(3)数据库备份是一种防范灾难的强力手段
(4)数据丢失原因
①程序错误
②人为错误
③计算机失败
④磁盘失败
⑤灾难
2、数据库备份的分类
(1)物理备份
冷备份:关闭数据库后进行备份,能较好的保证数据完整性
热备份:数据库运行时进行的备份,依赖于数据库的日志文件
温备份:锁定表格后进行备份
(2)逻辑备份
完全备份:对数据进行完整备份
差异备份:备份在完全备份后被修改过的数据
增量备份:备份上次完全备份或增量备份之后被修改过的数据
3、常用备份方法
(1)物理类备
①备份时数据库处于关闭状态,直接打包数据库文件
②备份速度快,恢复时也最简单
(2)专用备份工具mydump或mysqlhotcopy
mysqldump:逻辑备份工具
mysqlhotcopy:仅拥有备份MyISAM和ARCHIVE表
(3)启用二进制日志进行增量备份
①增量备份需要刷新二进制日志
(4)第三方工具备份
①Percona、XtraBackup等

二、完全备份
1、使用tar打包文件备份
(1)数据库文件很大,可以使用压缩率较大的xz格式压缩,需要先安装xz压缩格式工具:yum install -y xz
(2)打包:tar -Jcvf /opt/mysql-$(date +%F).tar.xz /usr/local/mysql/data/
(3)数据恢复:tar -Jxvf /opt/mysql-2020-03-04.tar.xzf /usr/local/mysql/data/
2、mydump工具
(1)表的完全备份:mysqldump -u 用户名 -p [密码] [选项] [数据库名] [表名]>/备份路径/文件名
(2)库的完全备份:mysqldump -u 用户名 -p [密码] [选项] [数据库名]>/备份路径/文件名
(3)多个库备份:mysqldump -u 用户名 -p [密码] [选项] --databases [库名1] [库名2]>/备份路径/文件名
(4)备份所有库:mysqldump -u 用户名 -p [密码] [选项] --all-databases>/备份路径/文件名
(5)表结构备份:mysqldump -u 用户名 -p [密码] -d [数据库名] [表1] [表2]>/备份路径/文件名

三、完全备份的数据恢复
1、恢复整库
(1)source命令恢复整库(登录mysql)
备份库:mysqldump -uroot -p111111 test > /opt/test.sql
②删除库:drop database test;
恢复库:source /opt/test.sql
(2)mysql命令恢复整库(无需登录mysql)
创建库:create database test;(需要先创建相应库)
mysql -uroot -p111111 test</opt/test.sql
2、恢复表
(1)source命令
备份表:mysqldump -uroot -p111111 test user > /opt/test-user.sql
②删除表:drop table test.user;
恢复表:source /opt/test-user.sql;
(2)mysql命令
msql -uroot -p111111 test < /opt/test-user.sql

四、增量备份
1、通过二进制日志备份
(1)二进制日志保存了所有更新或者可能跟新数据库的操作
(2)二进制日志在启动mysql服务后开始记录,并在文件达到max_binlog_size时或者接收到flush log命令后重新创建新的日志文件
(3)只需要定时执行flush log方法重新创建日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份
2、备份实例
(1)开启二进制日志功能
①修改配置文件的[myslqd]项,加入log-bin=mysql-bin,然后重启服务
/etc/init.d/mysqld restart --log-bin=mysql-bin
(2)确定字符集使用utf-8格式:show variables like ‘%char%’
(3)创建备份文件夹:mkdir /opt/bak_sql
(4)每周使用mysqldump备份库或表(完全备份)
(5)每天进行增量备份:mysqladmin -uroot -p111111 flush-logs
(6)把二进制日志保存到备份目录:cp mysql-bin.00001 /opt/bak_sql/

五、增量恢复
1、增量恢复适用场景
(1)人为的SQL语句破坏了数据库
(2)在进行下一次全备份之前发生系统故障导致数据库丢失
(3)在主从架构中,主库数据发生了故障
(4)数据丢失分类
①之丢失了完全备份之后更改的数据
②完全备份之后丢失所有数据
2、丢失完全备份之后更改的数据的恢复实例
(1)完全备份:mysqldump -uroot -p111111 test > /opt/bak_sql/test_$(date +%F).sql
(2)使用flush-logs生成的二进制日志文件,用于增量备份
①mysqladmin -uroot -p111111 flush-logs
(3)使用二进制日志文件恢复数据(注意恢复顺序,要先恢复最先生成的二进制文件,然后依次恢复)
mysqlbinlog /user/local/mysql/data/mysql-bin.000001 | mysql -uroot -p111111
②mysqlbinlog /user/local/mysql/data/mysql-bin.000002 | mysql -uroot -p111111
3、完全备份后丢失所有数据的恢复实例
(1)使用mysql命令恢复完整备份
①创建丢失的库:create database test;
②恢复完整备份:mysql -uroot -p111111 test < /opt/bak_sql/test_2020-03-04.sql
(2)使用二进制文件恢复数据
①mysqlbinlog /user/local/mysql/data/mysql-bin.000001 | mysql -uroot -p111111
②mysqlbinlog /user/local/mysql/data/mysql-bin.000002 | mysql -uroot -p111111
4、基于时间点与位置的恢复
(1)二进制日志文件中除了保存数据库修改命令以外,还保存了执行命令的时间和位置。可通过mysqlbinlog /usr/local/mysql/data/mysql-bin.000001查看

(2)基于时间点的恢复
①通过mysqlbinlog --stop-datetime与--start-datetime,使恢复过程跳过指定时间段。
1)mysqlbinlog --stop-datetime=’20-03-04 0:04:09’ /usr/local/mysql/adta/mysql-bin.000001 | mysql -uroot -p111111
2)mysqlbinlog --stop-datetime=’20-03-04 0:05:09’ /usr/local/mysql/adta/mysql-bin.000001 | mysql -uroot -p111111
②注意
1)执行时间点精确到秒
2)二进制文件中保存到日期格式需要调整为用“-”分割
(3)基于位置的恢复
通过--stop-position及--start-position进行比时间点更加精确的恢复,具体命令格式与时间点类似

六、备份脚本
1、全备份脚本(mysqldump)

2、增量备份脚本(二进制日志)

3、添加计划
(1)crontab -e
①0 1 * * 6 /root/qbf.sh
②0 1 */1 * * /root/zlbf.sh

七、备份思路
1、数据库需要定期实施备份
2、除了完全备份,开启日志功能也很重要,完全备份加上日志,可以对数据库进行最大还原
3、备份文件名需要使用同一和易理解的名称,推荐使用库名或表名加上时间的命名规则
4、企业备份策略思路
(1)数据更新频繁,则应该进行较为频繁的备份
(2)数据较为重要,则在有适当更新时进行备份
(3)在数据库压力小的时间段进行备份,如一周一次,然后每天增量备份
(4)根据公司规模,中小公司可一天一次全备,大公司可每周一次全备,每天进行增量,并尽量为企业实现主从复制架构

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章