MySQL数据库的备份、恢复、导出、导入(bin log和mydump)

2023-11-08

目录

一、使用 bin log 来恢复数据

一、bin log的三种格式

1、statement:基于SQL语句的复制(statement-based replication,SBR)

2、row:基于行的复制(row-based replication,RBR)

3、mixed:混合模式复制(mixed-based replication,MBR)

4、查看模式和更改模式

二、配置bin log策略

三、获取bin log文件列表

四、生成新的bin log文件

五、查看日志中的内容

1、在mysql中使用show binlog events查看

2、在shell中使用mysqlbinlog来查看

六、利用bin log 来恢复数据

1、通过pos来恢复

2、通过时间来恢复

二、逻辑备份和恢复

一、mysqldump工具实现逻辑备份

二、逻辑恢复

三、物理备份和恢复

一、物理备份

二、物理恢复

四、数据库的导出和导入

一、导出

1、通过INTO OUTFILE导出

2、使用mysqldump导出

3、使用mysql命令导出

二、导入

 五、数据库误删除恢复步骤


一、使用 bin log 来恢复数据

一、bin log的三种格式

1、statement:基于SQL语句的复制(statement-based replication,SBR)

  • 每一条会修改数据的sql都会记录在binlog中。
  • 优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。但是注意statement相比于row能节约多少性能与日志量,取决于应用的SQL情况。正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。
  • 缺点:由于记录的只是执行语句,为了这些语句在slave上正确运行,我们还必须记录每条语句在执行时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时相同的结果。另外,一些特定的函数功能如果要在slave和master上保持一致会有很多相关问题。

2、row:基于行的复制(row-based replication,RBR)

  • 5.1.5版本的MySQL才开始支持row level的复制,它不记录sql语句上下文相关信息,仅保存哪条记录被修改。
  • 优点:binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以row level的日志会非常清楚的记下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题。
  • 缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。但是新版本的MySQL对row level模式进行了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。

3、mixed:混合模式复制(mixed-based replication,MBR)

  • 从5.1.8版本开始,MySQL提供了Mixed格式,实际上就是Statement与Row的结合。
  • 在Mixed模式下,一般的语句修改使用statment格式保存binlog,如果一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

4、查看模式和更改模式

mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set, 1 warning (0.00 sec)

mysql> set binlog_format=mixed;
Query OK, 0 rows affected (0.00 sec)

二、配置bin log策略

在配置文件中添加

[mysqld]

# 指定 binary log 的路径和名称
log-bin="/var/lib/mysql/binlog"

# 存活时间
binlog_expire_logs_seconds=60000

# 单个 binlog 文件的最大大小
max_binlog_size=100M

# binlog的日志策略
binlog_format=mixed;

三、获取bin log文件列表

mysql> show binary logs;
+------------------+-----------+-----------+
| Log_name         | File_size | Encrypted |
+------------------+-----------+-----------+
| IU077-bin.000038 |       157 | No        |
| IU077-bin.000039 |      1400 | No        |
| IU077-bin.000040 |       157 | No        |
| IU077-bin.000041 |       333 | No        |
| IU077-bin.000042 |       157 | No        |
| IU077-bin.000043 |       157 | No        |
| IU077-bin.000044 |       157 | No        |
| IU077-bin.000045 |       157 | No        |
| IU077-bin.000046 |       157 | No        |
| IU077-bin.000047 |       157 | No        |
| IU077-bin.000048 |       180 | No        |
| IU077-bin.000049 |       180 | No        |
| IU077-bin.000050 |       157 | No        |
| IU077-bin.000051 |       157 | No        |
+------------------+-----------+-----------+

四、生成新的bin log文件

以下三种情况均可生成新的bin log

  1. 每当我们停止或重启服务器时,服务器会把日志文件记入下一个日志文件,MySQL会在重启时生成一个新的日志文件,文件序号递增。
  2. 如果日志文件超过max_binlog_size(默认值1G)系统变量配置的上限时,也会生成新的日志文件(在这里需要注意的是,如果你正使用大的事务,二进制日志还会超过max_binlog_size,不会生成新的日志文件,事务全写入一个二进制日志中,这种情况主要是为了保证事务的完整性)
  3. 手动的flush logs刷新日志,会生成一个新的日志文件;
mysql> flush logs;
Query OK, 0 rows affected (0.07 sec)

五、查看日志中的内容

1、在mysql中使用show binlog events查看

查看具体某个日志中的内容:

mysql> show binlog events in 'IU077-bin.000052';
+------------------+-----+----------------+-----------+-------------+-----------------------------------------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                                                  |
+------------------+-----+----------------+-----------+-------------+-----------------------------------------------------------------------+
| IU077-bin.000052 |   4 | Format_desc    |         1 |         126 | Server ver: 8.0.30, Binlog ver: 4                                     |
| IU077-bin.000052 | 126 | Previous_gtids |         1 |         157 |                                                                       |
| IU077-bin.000052 | 157 | Anonymous_Gtid |         1 |         234 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                  |
| IU077-bin.000052 | 234 | Query          |         1 |         345 | create database db_16 /* xid=20 */                                    |
| IU077-bin.000052 | 345 | Anonymous_Gtid |         1 |         422 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                  |
| IU077-bin.000052 | 422 | Query          |         1 |         555 | use `db_16`; create table tb1(id int, lname varchar(20)) /* xid=24 */ |
| IU077-bin.000052 | 555 | Anonymous_Gtid |         1 |         634 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                  |
| IU077-bin.000052 | 634 | Query          |         1 |         710 | BEGIN                                                                 |
| IU077-bin.000052 | 710 | Table_map      |         1 |         768 | table_id: 92 (db_16.tb1)                                              |
| IU077-bin.000052 | 768 | Write_rows     |         1 |         821 | table_id: 92 flags: STMT_END_F                                        |
| IU077-bin.000052 | 821 | Xid            |         1 |         852 | COMMIT /* xid=26 */                                                   |
| IU077-bin.000052 | 852 | Rotate         |         1 |         899 | IU077-bin.000053;pos=4                                                |
+------------------+-----+----------------+-----------+-------------+-----------------------------------------------------------------------+
12 rows in set (0.00 sec)

指定从某个pos开始查看

mysql> show binlog events in 'IU077-bin.000052' from 710;
+------------------+-----+------------+-----------+-------------+--------------------------------+
| Log_name         | Pos | Event_type | Server_id | End_log_pos | Info                           |
+------------------+-----+------------+-----------+-------------+--------------------------------+
| IU077-bin.000052 | 710 | Table_map  |         1 |         768 | table_id: 92 (db_16.tb1)       |
| IU077-bin.000052 | 768 | Write_rows |         1 |         821 | table_id: 92 flags: STMT_END_F |
| IU077-bin.000052 | 821 | Xid        |         1 |         852 | COMMIT /* xid=26 */            |
| IU077-bin.000052 | 852 | Rotate     |         1 |         899 | IU077-bin.000053;pos=4         |
+------------------+-----+------------+-----------+-------------+--------------------------------+
4 rows in set (0.00 sec)

查看当前正在写入的日志状态:

mysql> show master status\G
*************************** 1. row ***************************
             File: IU077-bin.000053
         Position: 157
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

2、在shell中使用mysqlbinlog来查看

mysqlbinlog -v 日志文件的路径

例如:
mysqlbinlog -v /usr/local/mysql/data/binlog.000010

六、利用bin log 来恢复数据

注意:

        bin log不是通过回滚来恢复数据的,而是重新执行SQL语句来恢复的。

1、通过pos来恢复

方式一:在shell中执行mysql登录和切换

mysqlbinlog --start-position=100 --stop-position=300 --database=数据库名 binlog文件 | mysql -uroot -p密码 -v 数据库名

方式二:生成.sql后缀的脚本,然后在mysql中执行该脚本

# 第一步:先生成sql脚本
mysqlbinlog --start-position=100 --stop-position=300 --database=数据库名 binlog文件 > resume.sql

# 第二步:在sql中执行该脚本
mysql> source 脚本路径/脚本名称

2、通过时间来恢复

position换成datetimetimestramp


二、逻辑备份和恢复

一、mysqldump工具实现逻辑备份

基础操作:

# 备份单个数据库
mysqldump -uroot -p密码 database_1 > database_1.sql

# 备份全部数据库
mysqldump -uroot -p密码 --all-databases
# 或者
mysqldump -uroot -p密码 --A

更细致的操作:

参数 作用
--databases 或 -B 备份部分数据库
数据库名称后面跟表名 备份部分表
--where="id < 10" 备份表中的部分数据
--ignore-table=数据库.表名 不备份这个表
--no-create-info 不备份结构,仅备份数据
--no_data 不备份数据

二、逻辑恢复

1、在shell中恢复

mysql -uroot -p密码 数据库名 < .sql脚本

2、在mysql中恢复

mysql> source 脚本路径/脚本名称.sql

三、物理备份和恢复

一、物理备份

1、先给数据库上锁,防止备份过程中数据库被修改

mysql> flush tables with read lock;

2、物理拷贝备份

cp -r database_1 /backup/database_1_bak

3、数据库解锁(一定不能忘记解锁)

mysql> unlock tables;

二、物理恢复

1、物理移动

cp 数据库 路径/名称

2、重启mysql服务

systemctl restart mysql

3、给mysql用户赋予权限

chown -R mysql.mysql /var/lib/mysql/数据库名

四、数据库的导出和导入

一、导出

1、通过INTO OUTFILE导出

1、先查看数据库是否可以导出

mysql> show variables like '%secure%';
+--------------------------+------------------------------------------------+
| Variable_name            | Value                                          |
+--------------------------+------------------------------------------------+
| require_secure_transport | OFF                                            |
| secure_file_priv         | D:\Program Files (x86)\MySQL\Data 8.0\Uploads\ |
+--------------------------+------------------------------------------------+

2、开始导出

mysql> select * from tb1 INTO OUTFILE "D:\Program Files (x86)\MySQL\Data 8.0\Uploads\tb1.txt";

2、使用mysqldump导出

同时生成txt文件和sql脚本

mysqldump -uroot -p密码 -T "路径" 数据库名 表名;

3、使用mysql命令导出

把查询内容导出内容到txt文件

mysql -uroot -p密码 --execute="select * from tb1;" 数据库名 > 名字.txt;

二、导入

1、LOAD DATA INFILE 导入

mysql> LOAD DATA INFILE 'txt文本文件' INTO TABLE dbname.tbname;

 五、数据库误删除恢复步骤

  1. 取最近一次的全量备份。
  2. 用全量备份恢复出一个临时库。
  3. 取出全量备份之后的bin log日志。
  4. 剔除日志中的误操作SQL,把其他语句都应用到临时库。
  5. 回复完成之后,把临时库恢复到主库。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL数据库的备份、恢复、导出、导入(bin log和mydump) 的相关文章

  • 访问数据库 LIMIT 关键字

    我试图让我的页面列表功能在 ASP 中与 Access 数据库一起工作 但我不知道 Microsoft SQL 中 LIMIT 的替代方案 我已经尝试过 TOP 但这似乎不起作用 这是 MySQL 中使用的语句 SELECT FROM cu
  • MySQL 正在将我的时间戳值转换为 0000-00-00

    我是 PHP 新手 目前仍在学习中 我认为我的注册表有问题 username password email全部成功插入MySQL registered and last seen不要 我以为我正在使用getTimestamp 错了 但它呼应
  • Oracle SQL-根据记录的日期与历史记录标记记录

    这是我在论坛上的第一篇文章 通常我能够找到我需要的东西 但说实话 我不太确定如何针对该问题提出正确的问题 因此 如果论坛上已经有答案而我错过了 请接受我的歉意 我通过 Benthic Software 在 Oracle 数据库中运行以下代码
  • Innodb页面大小设置

    在innodb中 页面大小默认为16kb 如何将页面大小设置为 8kb 是否有在源编译步骤中设置的选项 您不需要在源编译步骤中指定页面大小 MySQL 5 6 及更高版本支持不同的页面大小 无需重新编译 但是 您必须在初始化 InnoDB
  • mod_rewrite, .htaccess 连接mysql数据库

    我希望 htaccess 文件中的 mod rewrite 链接到 mysql 数据库以向我提供映射信息 具体来说 我使用单个代码库来托管多个站点 因此 如果用户请求图像 例如 http www example com images car
  • 如何在 bash 上运行 MySQL 命令?

    以下代码在命令行上运行 mysql user myusername password mypassword database mydatabase execute DROP DATABASE myusername CREATE DATABA
  • 如何在 Laravel 5 中使用 Orchestral/Tenanti 构建具有多个数据库的多租户应用程序?

    我正在尝试使用 Laravel 5 构建和应用程序 它应该是使用多个数据库的多租户数据库架构 我的雇主出于安全目的要求这样做 我尝试手动管理主数据库迁移和租户迁移 但失败了 所以我决定借助 Laravel 特定包的帮助 这应该是我所需要的
  • dayname(curdate()) 不适用于 codeigniter php

    此 sql 在 phpmyadmin 中有效 但在 codeigniter php 中无效 function getProgramsHomepage data array this gt db gt select p name p star
  • <表值函数> 不是可识别的内置函数名称

    我收到此错误 消息 195 第 15 级 状态 10 第 1 行 fnParseName 不是可识别的内置函数名称 对于这个查询 SELECT fnParseName DOCTORFIRSTNAME DOCTORLASTNAME FROM
  • 连接两个表而不返回不需要的行

    我的表结构如下所示 tbl users tbl issues userid real name issueid assignedid creatorid 1 test 1 1 1 1 2 test 2 2 1
  • 如何为“%abc%”搜索创建文本索引?

    我想对查询进行索引x like abc 如果我有一个如下表 create table t data varchar 100 我想创建一个索引以便能够有效地执行以下操作 select from t where contains abc 和这个
  • 在实体框架 6 中使用 SqlQuery>

    我正在尝试在 EF 6 中执行 SQL 查询 select查询返回两个字符串列 例如select a b 并且可以有任意数量的行 我想将结果映射到字典 但我无法摆脱以下错误 错误 1 无法将类型 System Data Entity Inf
  • MySQL 5:我的 GROUP BY 字段的顺序重要吗?

    Peeps 我的 MySQL 查询中有一些聚合 计算字段 我的 GROUP BY 子句是动态生成的 具体取决于用户在 Web 表单中选择的选项 很好奇 GROUP BY 子句中列出的字段顺序是否会对计算产生任何影响 例如 SUM AVERA
  • 使用 MySQL 的 CURDATE() 或 PHP 的 date() 更快?

    使用mysql查询是不是更快 SELECT CURDATE as today 或 PHP 语句 curdate date Y m d 同样的答案是否适用于使用date VS MySQL 的NOW and CURTIME 如果您只是执行查询以
  • 什么是动态 SQL 查询?何时需要使用动态 SQL 查询?

    什么是动态 SQL 查询 何时需要使用动态 SQL 查询 我正在使用 SQL Server 2005 这里有几篇文章 动态SQL简介 http www sqlteam com article introduction to dynamic
  • 从 Presto 中的 JSON 列获取特定值

    我有一个带有 JSON 列的表points其中一行为 0 0 2 1 1 2 2 0 5 15 1 2 20 0 7 我想获取键的值 1 and 20 并将它们存储为别名 例如first and second在查询中 到目前为止我所做的是
  • SQL Server 2008 中的全文搜索一步一步

    如何开始使用SQL Server 2008 中的全文搜索 阅读这些链接 SQL SERVER 2008 创建全文目录和全文搜索 http blog sqlauthority com 2008 09 05 sql server creatin
  • 在内连接中重用 mysql 子查询

    我正在尝试优化查询 试图避免重复用 指示的查询 复杂查询 使用两次 结果相同 原始查询 SELECT news FROM news INNER JOIN SELECT myposter FROM SELECT COMPLEX QUERY U
  • 当我尝试计算 mysqli 结果时,为什么会收到警告?

    下面的代码会导致此警告 警告 count 参数必须是数组或实现 Countable 的对象 为什么要这样做 如何防止出现警告 if isset GET edit sonum GET edit update true result mysql
  • 如何使用Python3.4在tornado中进行异步mysql操作?

    我现在使用Python3 4 我想在Tornado中使用异步mysql客户端 我已经发现torndb https github com bdarnell torndb但在阅读其源代码后 我认为它无法进行异步mysql操作 因为它只是封装了M

随机推荐

  • Hibernate学习笔记 单表映射

    建立实体类 配置好SessionFactory之后 我们就可以开始建立一对一的单表映射了 首先需要建立一个实体类 这里Getter Setter toString equals等方法省略了 我们可以方便的使用IDEA或者Eclipse的生成
  • 【分享】ROM厂商刷机工具合集

    1 MTK刷机 SP Flash Tool下载地址 SP Flash Tool v5 1924 Download SmartPhone Flash Tool MTKClient 下载地址 Releases notmyst33d mtkcli
  • MySQL—存储引擎(下)

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 树高千尺 落叶归根人生不易 人间真情 前言 上一章讲了存储引擎 本章继续 从特点开始 目录 MySQL 1
  • 中国1-0胜新加坡

    TOM体育讯 北京时间8月16日 亚洲杯预选赛战火重新点燃 中国队在本轮比赛中坐镇天津泰达体育场迎战小组赛的又一个对手新加坡队 结果在赵旭日下半场被早早罚下 中国队以少打多的不利局面下 中国队的顽强感动了上苍 也拯救了自己 补时最后一分钟
  • 【Unity】获取相机画面将其保存成图片

    void CameraCapture Camera m Camera string filename RenderTexture rt new RenderTexture Screen width Screen height 16 m Ca
  • 抓包工具Wireshark使用体会

    这两天在工作上遇到了一些问题 必须要用抓包工具来捕获手机端发送过来的数据包 分析其帧结构 以前虽然学习过网络知识 但是也从未接触过抓包工具Wireshark 迫于工作的压力 自己在摸索中学到了一些基本的使用方法 文件格式 pcap 帧排序
  • 笔记(一)斯坦福CS224W图机器学习、图神经网络、知识图谱

    节点和连接构成的图 如何对图数据进行挖掘 传统机器学习 数据是独立同分布的 解决表格 矩阵 序列等问题 图机器学习处理连接的数据 需要满足以下几个方面 1 图是任意尺寸输入 2 图是动态变化的 有时也是多模态数据 图 可以实现端到端的表示学
  • 矩阵分析学习(补充)

    在系统分析中 会涉及到多项式矩阵互质性的判别问题 此类问题通常归结为两种 1 具有相同行数的多项式左互质 2 具有相同列数的多项式右互质 一 多项式矩阵的右公因子 左公因子 的定义 二 多项式矩阵的最大右公因子 最大左公因子 的定义 首先这
  • Asp.net 移动开发

    Asp net能进行移动开发 移动开发是手机运用 而asp net是网页开发 能合在一起吗 答案是能的 随着科技的发展 现在asp net也能进行移动开发 移动开发也称为手机开发 或叫做移动互联网开发 是指以手机 PDA UMPC等便携终端
  • 基于MATLAB的白鲸算法在太阳能光伏模型参数估计中的应用

    基于MATLAB的白鲸算法在太阳能光伏模型参数估计中的应用 本文将介绍如何使用MATLAB编写基于白鲸算法的太阳能光伏模型参数估计 并提供相应的源代码 太阳能光伏模型的参数估计是对光伏系统性能分析的重要步骤 它可以帮助我们了解和优化光伏系统
  • 如何解决redis的缓存击穿、缓存穿透、缓存雪崩等问题?

    关注我 升职加薪就是你 1 缓存击穿 指一个非常热点的key在缓存过期的一刻 同时有大量的并发请求访问该key 导致所有请求都落到了数据库上 引起数据库压力过大甚至宕机 解决方案 1 设置热点数据永不过期 2 加互斥锁 只允许一个请求去查询
  • Java获取前N个季度的开始时间和结束时间

    获取前N个季度的开始日期和结束日期 param count return private List
  • 【十大经典排序算法】C语言实现

    十大经典排序算法 插入类排序 直接插入排序 折半 二分 插入排序 希尔排序 交换类排序 冒泡排序 快速排序 选择类排序 选择排序 树形选择排序 堆排序 归并排序 计数排序 分配类排序 捅排序 基数排序 插入类排序 直接插入排序 void i
  • 关于pip安装第三方库,但PyCharm中却无法识别的问题;以及PyCharm安装第三方库的方法解析

    Table of Contents 一 问题具体描述 二 解决方法 1 方法一 在PyCharm下载第三方库 即把之前下的库作废 这里重新再下一次 2 方法二 坚持用pip的方法安装第三方库 三 扩展延伸 pip install 安装路径问
  • BP神经网络的非线性系统建模以及matlab神经网络工具箱的使用

    在所有的关系中 数学公式的线性表达是对那些规律性数据的预测统计 而非线性关系的数据 数学方程式只能通过多个参数尽可能模拟数据曲线 神经网络的非线性拟合能力不仅在于参数多还在于激活函数的非线性表达 以拟合拟合的非线性函数为 为例 BP神经网络
  • 【论文阅读 08】Defect Detection in Electronic Surfaces Using Template-Based Fourier Image Reconstruction

    比较老的一篇论文 基于模板的傅里叶图像重建电子表面的缺陷检测 关键词 缺陷检测 傅里叶变换 F T 机器视觉 印刷电路板 PCB 模板匹配 总结 1 Abstract 一种用于检测和定位非周期性模式图像中小缺陷的新方法 在电子工业中 例如在
  • 完美解决E: Unable to lock directory /var/lib/apt/lists/方案

    使用命令 sudo fuser vki var lib apt lists lock 重新执行 sudo apt update
  • QT之动态进度条

    简介 前两天需要接到一个需求需要做一个好看的进度条 在网上搜了一圈发现要不然就是不符合我的需求要不然就是没有源码 最后找到一个大佬写的有部分源码的 自己也折腾了一个 原文链接 效果图 思路 主要就是重写了QProcessBar的paintE
  • Chatglm2使用及微调教程

    1 下载chatglm2代码 GitHub THUDM ChatGLM2 6B ChatGLM2 6B An Open Bilingual Chat LLM 开源双语对话语言模型 github代码见上面所示 2 下载chatglm2 6B模
  • MySQL数据库的备份、恢复、导出、导入(bin log和mydump)

    目录 一 使用 bin log 来恢复数据 一 bin log的三种格式 1 statement 基于SQL语句的复制 statement based replication SBR 2 row 基于行的复制 row based repli