MYSQL数据库(八)数据库备份和恢复

2023-10-27

5 备份和恢复

5.1 备份恢复概述
5.1.1 为什么要备份

灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景

5.1.2 备份类型
  • 完全备份,部分备份
    完全备份:整个数据集
    部分备份:只备份数据子集,如部分库或表
  • 完全备份、增量备份、差异备份
    增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂

在这里插入图片描述

差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单

在这里插入图片描述

注意:二进制日志文件不应该与数据文件放在同一磁盘

  • 冷、温、热备份
    冷备:读、写操作均不可进行,数据库停止服务
    温备:读操作可执行;但写操作不可执行
    热备:读、写操作均可执行
    MyISAM:温备,不支持热备
    InnoDB:都支持

  • 物理和逻辑备份
    物理备份:直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快(需要停服务)
    逻辑备份:从数据库中“导出”数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度

5.1.3 备份什么
  • 数据
  • 二进制日志、InnoDB的事务日志
  • 用户帐号,权限设置,程序代码(存储过程、函数、触发器、事件调度器)
  • 服务器的配置文件
5.1.4 备份注意要点
  • 能容忍最多丢失多少数据
  • 备份产生的负载
  • 备份过程的时长
  • 温备的持锁多久
  • 恢复数据需要在多长时间内完成
  • 需要备份和恢复哪些数据
5.1.5 还原要点
  • 做还原测试,用于测试备份的可用性
  • 还原演练,写成规范的技术文档
5.1.6 备份工具
  • cp, tar等复制归档工具:物理备份工具,适用所有存储引擎;只支持冷备;完全和部分备份(需要停服务,无法保证数据时间一致性
  • LVM的快照:先加读锁,做快照后解锁,几乎热备;借助文件系统工具进行备份(用的不多
  • mysqldump:逻辑备份工具,适用所有存储引擎,对MyISAM存储引擎进行温备;支持完全或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份(主流工具
  • xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份(相对较少
  • MariaDB Backup: 从MariaDB 10.1.26开始集成,基于Percona XtraBackup 2.3.8实现(付费
  • mysqlbackup:热备份, MySQL Enterprise Edition组件
  • mysqlhotcopy:PERL 语言实现,几乎冷备,仅适用于MyISAM存储引擎,使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库(用的越来越少
5.1.6 基于 LVM 的快照备份

生产中用的较少,前提是事先要把数据库存到逻辑卷里

(1) 请求锁定所有表
mysql> FLUSH TABLES WITH READ LOCK;
(2) 记录二进制日志文件及事件位置
mysql> FLUSH LOGS;          #刷新日志,生成新的二进制日志
mysql> SHOW MASTER STATUS;  #看到当前二进制大小和使用文件是谁
mysql -e 'SHOW MASTER STATUS' > /PATH/TO/SOMEFILE
(3) 创建快照
lvcreate -L # -s -p r -n NAME /DEV/VG_NAME/LV_NAME
(4) 释放锁
mysql> UNLOCK TABLES;
(5) 挂载快照卷,执行数据备份
(6) 备份完成后,删除快照卷     #不删的话只要有数 据更新就会写入快照,影响性能
(7) 制定好策略,通过原卷备份二进制日志
5.1.7 实战案例:数据库冷备份和还原
#在目标服务器(10.0.0.18)安装mariadb-server,不启动服务
[root@centos8 ~]#dnf install mariadb-server

#在源主机(10.0.0.8)先启用二进制日志  (实验需要)
[root@centos8 ~]#vim /etc/my.cnf.d/mariadb-server.cnf 
[mysqld]
log-bin=/data/logbin/mysql-bin
[root@centos8 ~]#mkdir /data/logbin
[root@centos8 ~]#chown mysql.mysql /data/logbin
[root@centos8 ~]#systemctl restart mariadb
[root@centos8 ~]#ll /data/logbin/
total 8
-rw-rw---- 1 mysql mysql 328 Jun 12 21:37 mysql-bin.000001
-rw-rw---- 1 mysql mysql  30 Jun 12 21:37 mysql-bin.index

#在源主机(10.0.0.8)执行停止服务
[root@centos8 ~]# systemctl stop mariadb

#复制相关文件
[root@centos8 ~]# scp /etc/my.cnf.d/mariadb-server.cnf 10.0.0.18:/etc/my.cnf.d/
[root@centos8 ~]# scp -r /var/lib/mysql/* 10.0.0.18:/var/lib/mysql/
[root@centos8 ~]# scp -r /data/logbin/ 10.0.0.18:/data/ #10.0.0.18事先存在/data/目录

#保留属性:推荐使用
[root@centos8 ~]#rsync -av /var/lib/mysql/ 10.0.0.18:/var/lib/mysql/
[root@centos8 ~]#rsync -av /data/logbin 10.0.0.18:/backup  #数据库更新之前的二进制日志
[root@centos8 ~]#rsync -a /etc/my.cnf.d/mariadb-server.cnf  10.0.0.18:/backup
[root@centos8 ~]#ll /data/logbin/
total 8
-rw-rw---- 1 mysql mysql 351 Jun 12 21:44 mysql-bin.000001
-rw-rw---- 1 mysql mysql  30 Jun 12 21:37 mysql-bin.index
-rw-rw---- 1 mysql mysql   0 Jun 12 21:44 mysql-bin.state

#若源主机在备份之后又更新了数据库,则需要将最新的二进制日志也进行备份
[root@centos8 ~]#rsync -av /data/logbin 10.0.0.18:/backup/newlogbin
[root@centos8 ~]#ll /backup/newlogbin/
total 12
-rw-r----- 1 root root 351 Jun 13 23:16 mysql-bin.000001
-rw-r----- 1 root root 913 Jun 13 23:16 mysql-bin.000002
-rw-r----- 1 root root  60 Jun 13 23:16 mysql-bin.index
[root@centos8 ~]#mysqlbinlog /backup/newlogbin/mysql-bin.000002 > logbin.sql  #mysqlbinlog可以查看二进制日志
MariaDB [(none)]> show variables like 'sql_log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin   | ON    |
+---------------+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> set sql_log_bin=0;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> show variables like 'sql_log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin   | OFF   |
+---------------+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> source /root/logbin.sql
MariaDB [hellodb]> set sql_log_bin=1;
#到此更新后的数据也都还原了

#在目标主机(10.0.0.18)执行
[root@centos8 ~]#chown -R mysql.mysql /var/lib/mysql/
[root@centos8 ~]#chown -R mysql.mysql /data/logbin/
[root@centos8 ~]#systemctl start mariadb

注意

还原数据时要把二进制日志功能停掉sql_log_bin,不然还原的过程也会存到日志里

5.2 mysqldump备份工具
5.2.1 mysqldump 说明

逻辑备份工具

mysqldump, mydumper, phpMyAdmin
Schema和数据存储在一起、巨大的SQL语句、单个巨大的备份文件

mysqldump:是MySQL的客户端命令,通过mysql协议连接至mysql服务器进行备份

命令格式:

mysqldump [OPTIONS] database [tables] #支持指定数据库和指定多表的备份,但数据库本身定义不备份,造成的问题较多,如字符集,排序规则等若没有提前备份,则数据库不可用
mysqldump [OPTIONS] –B DB1 [DB2 DB3...] #支持指定数据库备份,包含数据库本身定义也会备份
mysqldump [OPTIONS
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MYSQL数据库(八)数据库备份和恢复 的相关文章

  • 删除表的重复项

    In my activity logs 它包含列 material name user id mod result 这标志着测试是否通过 失败 cert links 不知何故 用户生成了两倍的条目material name与cert lin
  • MySQL:如何获取每个分组的x个结果数[重复]

    这个问题在这里已经有答案了 可能的重复 mysql 在 GROUP BY 中使用 LIMIT 来获取每组 N 个结果 https stackoverflow com questions 2129693 mysql using limit w
  • 自动删除主键序列中的间隙

    我正在创建一个网页 该网页根据用户操作将数据存储到 MySQL 数据库中 数据库有很多行 行的主键是列 rowID 它只是按顺序对行进行编号 例如 1 2 3 4 用户可以选择删除行 问题是当用户删除最后一行以外的行时 rowID 中有一个
  • 为什么我在 MySQL 中设置更大的 INT 数据类型长度时没有收到错误消息?

    我对 MySql 中的数据类型长度有点困惑 我阅读了参考手册http dev mysql com doc refman 5 0 en data types html http dev mysql com doc refman 5 0 en
  • 计算 mysql 数据库行数的最佳方法

    在遇到 mysql 查询加载时间慢的问题后 我现在正在寻找计算行数的最佳方法 我曾经愚蠢地使用过mysql num rows 函数来做到这一点 现在意识到这是最糟糕的方法 我实际上正在制作一个分页来用 PHP 制作页面 我找到了几种计算行数
  • 如何在 codeigniter 查询中使用 FIND_IN_SET?

    array array classesID gt 6 this gt db gt select gt from this gt table name gt where array gt order by this gt order by q
  • 当复选框条件更改时,如何使用ajax更新mysql数据库?

    我有一个在客户端按行显示的文章表 每篇文章都有一个唯一的 ID 并包含一个复选框以指示该文章是否被选中为收藏夹 如果它是最喜欢的 则该复选框已被选中 如果没有 则未选中 现在 如果特定于每一行的复选框条件发生变化 我需要 js 或 jque
  • 在上下文中提取搜索字符串

    我正在尝试执行 MySQL 查询 在上下文中提取搜索字符串 因此 如果搜索是 mysql 我想从 body 列返回类似的内容 下载后只需几分钟MySQL安装程序即可使用 这就是我现在得到的 但它不起作用 因为它只是从正文字段中获取前 20
  • MySQL - 多个结果集

    我正在使用 NET Connector 连接到 MySQL 在我的应用程序中 很少有线程使用相同的连接 因此如果 MySQLDataReader 尚未关闭并且某个线程正在尝试执行查询 则会出现该错误 已经有一个打开的 DataReader
  • MySQL 可选的带有 MATCH 的 LEFT JOIN

    我有以下查询 它对 MySQL Innodb 数据库中同一搜索词的两个不同表中的两列执行全文搜索 SELECT Id MATCH tb1 comment tb2 comment AGAINST search term IN BOOLEAN
  • MySQL 和 PHP 参数 1 作为资源

    好吧 当我运行下面提到的代码时 PHP 向我抛出此错误 在日志中 Error mysql num rows 期望参数 1 为资源 第 10 行 place 中给出的字符串 9 11号线 queryFP SELECT FROM db coun
  • JDBC 错误:在结果集开始之前[重复]

    这个问题在这里已经有答案了 我在 Java Eclipse 中收到错误消息 我在 MySql 中有一个数据库 它有列 String user name int id time int id desk int user password 我想
  • Dapper 或 MySql 未找到包含句号“.”的存储过程。

    我有一个简单的 C 控制台 它使用 Dapper ORM 调用本地 MySql 数据库 以执行名为的存储过程users UserCreate 但是 当运行查询时 我收到一个异常 在数据库 用户 中找不到过程或函数 UserCreate Bu
  • 显示和随机化 php 数组

    我有一个显示结果的数组 如下所示 Array 0 gt 71 1 gt 56 2 gt 64 3 gt 82 4 gt 90 5 gt 80 6 gt 65 7 gt 62 8 gt 14 9 gt 3 我的代码是 while row my
  • MySQL JOIN 滥用?情况会变得有多糟糕?

    我读了很多关于关系数据库的文章 在每个 SELECT 上使用许多 JOIN 语句 但是 我一直想知道滥用这种方法从长远来看是否会出现任何性能问题 例如 假设我们有一个users桌子 我通常会添加 最常用 的数据 而不是进行任何额外的联接 例
  • 将IP保存到数据库中

    当用户登录时 我想将他们的 IP 保存在数据库中 我该怎么做呢 MySQL 字段最适合使用哪种类型 获取IP的PHP代码是什么样的 我正在考虑将其用作登录 会话内容的额外安全功能 我正在考虑使用用户现在拥有的 IP 检查用户从数据库登录的
  • “修改列”与“更改列”

    我知道 我们不能使用重命名列MODIFY COLUMN语法 但我们可以使用CHANGE COLUMN syntax 我的问题是 主要用途是什么modify syntax 例如 ALATER TABLE tablename CHANGE co
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v

随机推荐