• 数据备份与恢复


    数据备份与恢复

    数据备份重要性

    • 备份的主要目的是灾难恢复。

    • 在生产环境中,数据的安全性至关重要。

    • 任何数据的丢失都可能产生严重的后果。

    • 造成数据丢失的原因:

      • 程序错误
      • 人为操作错误
      • 运算错误
      • 磁盘故障
      • 灾难(如火灾、地震)和盗窃

    数据库备份分类和备份策略

    数据库备份的分类

    物理备份

    物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。

    物理备份方法:

    • 冷备份(脱机备份) :是在关闭数据库的时候进行的
    • 热备份(联机备份) :数据库处于运行状态,依赖于数据库的日志文件
    • 温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作
    逻辑备份

    逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份。

    即以sql语句的形式,把库、表结构、表数据保存下来。

    数据库的备份策略

    • 完全备份(全量备份):每次对数据库进行完整的备份。
    • 差异备份:备份自从上次完全备份之后被修改过的文件。
    • 增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份。

    常见的备份方法

    物理冷备: (完全备份)

    • 备份时数据库处于关闭状态,直接打包数据库文件
    • 备份速度快,恢复时也是最简单的

    专用备份工具mydump或mysqlhotcopy (完全备份,逻辑备份)

    • mysqldump常用的逻辑备份工具 (导出为sql脚本)
    • mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

    启用二进制日志进行增量备份 (增量备份)

    进行增量备份,需要刷新二进制日志

    第三方工具备份

    • 免费的MySQL热备份软件Percona XtraBackup

    (阿里云的工具:dts,支持热迁移)

    完全备份

    物理冷备份与恢复

    1. 关闭MySQL数据库
    2. 使用tar命令直接打包数据库文件夹
    3. 直接替换现有MySQL目录即可
    操作
    rpm -q xz
    	#使用xz工具进行压缩,检查xz工具是否已安装
    	
    yum install xz -y
    	#如果没安装,可以先yum安装
     
    systemctl stop mysqld
    	#关闭服务
    mkdir /backup/
    	#创建备份目录
     
    tar Jcvf /backup/mysql_all_$(date +%F).tar.xz <数据库文件存放目录>
    	#打包数据库文件。
    	#源码编译安装/usr/local/mysql/data 
     	#yum安装​/var/lib/mysql/
     	
    cd /backup/
    	#切换到备份目录 
    	
    ls
    	#查看目录内容
    	
    tar tf mysql_all_2022-06-05.tar.xz
    	#查看tar包内的文件 
    
    恢复
    tar Jxvf /backup/mysql_all_2024-11-22.tar.xz
    	#解压备份的数据库文件。
    mv /backup/usr/local/mysql/data/  <数据库文件存放目录>
    

    mysqldump备份与恢复

    1. MySQL自带的备份工具,可方便实现对MySQL的备份
    2. 可以将指定的库、表导出为SQL脚本
    3. 使用命令mysq|导入备份的数据
    4. 操作
    mysqldump -u root -p密码 --databases 库1 [库2 ....] > XXX.sql
    	#备份一个或多个指定的库及库中所有的表
    	
    mysqldump -u root -p密码 --all-databases > XXX.sql
    	#备份所有库
    	
    mysqldump -u root -p密码 库名 > XXX.sql
    	#只备份指定库中的所有表(不包含库对象本身)
    	
    mysqldump -u root -p密码 库名 表1 [表2 ....] > XXX.sql
    	#只备份指定库中的一个或多个指定的表(不包含库对象本身)
    

    恢复

    恢复数据库
    mysql -u root -p -e 'drop database xy101;'
    #“-e”选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出
    mysql -u root -p -e 'SHOW DATABASES;'
    
    mysql -u root -p < /opt/xy101.sql
    mysql -u root -p -e 'SHOW DATABASES;'
    
    恢复数据表
    #当备份文件中只包含表的备份,而不包含创建的库的语句时,执行导入操作时必须指定库名,且目标库必须存在。
    mysqldump -u root -p xy101 info1 > /opt/xy101_info1.sql
    
    mysql -u root -p -e 'drop table xy101.info1;'
    mysql -u root -p -e 'show tables from xy101;'
    
    mysql -u root -p xy101 < /opt/xy101_info1.sql
    mysql -u root -p -e 'show tables from xy101;'
    

    增量备份

    MySQL 增量备份

    1.开启二进制日志功能
    vim /etc/my.cnf
    [mysqld]
    log-bin=mysql-bin
    binlog_format = MIXED				#可选,指定二进制日志(binlog)的记录格式为 MIXED
    server-id = 1
    
    #二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式)
    
    systemctl start mysqld
    ls -l /usr/local/mysql/data/mysql-bin.*
    
    2.可每周对数据库或表进行完全备份
    mysqldump -u root -p xy101 info1 > /opt/xy101_info1_$(date +%F).sql
    mysqldump -u root -p --databases xy101 > /opt/xy101_$(date +%F).sql
    
    3.可每天进行增量备份操作,生成新的二进制日志文件(例如 mysql-bin.000002)
    mysqladmin -u root -p flush-logs
    
    4.插入新数据,以模拟数据的增加或变更
    use xy101;
    insert into info1 values(3,'user3','male','game');
    insert into info1 values(4,'user4','female','reading');
    
    5.再次生成新的二进制日志文件(例如 mysql-bin.000003)
    mysqladmin -u root -p flush-logs
    #之前的步骤4的数据库操作会保存到mysql-bin.000002文件中,之后数据库数据再发生变化则保存在mysql-bin.000003文件中
    
    6.查看二进制日志文件的内容
    cp /usr/local/mysql/data/mysql-bin.000002 /opt/
    mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
    #--base64-output=decode-rows:使用64位编码机制去解码并按行读取
    #-v:显示详细内容
    

    MySQL 增量恢复

    一般恢复
    1)模拟丢失更改的数据的恢复步骤
    use xy101;
    delete from info1 where id=3;
    delete from info1 where id=4;
    
    mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p2)模拟丢失所有数据的恢复步骤
    use xy101;
    drop table info1;
    
    mysql -u root -p xy101 < /opt/xy101_info1_2020-11-22.sql
    mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p
    
    断点恢复
    mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
    例:
    # at 302
    #201122 16:41:16
    插入了“user3”的用户数据
    
    # at 623
    #201122 16:41:24
    插入了“user4”的用户数据
    
    (1)基于位置恢复
    #仅恢复到操作 ID 为“623”之前的数据,即不恢复“user4”的数据
    mysqlbinlog --no-defaults --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p
    
    #仅恢复“user4”的数据,跳过“user3”的数据恢复
    mysqlbinlog --no-defaults --start-position='623' /opt/mysql-bin.000002 | mysql -uroot -p2)基于时间点恢复
    #仅恢复到 16∶41∶24 之前的数据,即不恢复“user4”的数据
    mysqlbinlog --no-defaults --stop-datetime='2020-11-22 16:41:24' /opt/mysql-bin.000002 |mysql -uroot -p
    
    #仅恢复“user4”的数据,跳过“user3”的数据恢复
    mysqlbinlog --no-defaults --start-datetime='2020-11-22 16:41:24' /opt/mysql-bin.000002 |mysql -uroot -p
    
    
    #如果恢复某条SQL语句之前的所有数据,就stop在这个语句的位置节点或者时间点
    #如果恢复某条SQL语句以及之后的所有数据,就从这个语句的位置节点或者时间点start
    
    
  • 相关阅读:
    Android中的进度条
    bugku-web-社工-初步收集
    为什么HashMap头插法会造成死循环?
    一些事宜记录
    JS 采用JSON.parse实现深拷贝时出现的问题?
    VueUse、View Transitions API实现暗黑模式主题动画切换效果
    HCM 初学 ( 四 ) - 时间限制
    JAVA启动参数备完
    【Linux守护进程】一、进程组与会话
    sourTree提交代码遇到问题解决办法
  • 原文地址:https://blog.csdn.net/JIUYINGQAQ/article/details/139842314