数据库很重要,没有备份,数据丢失只能跑路。所以还是做好备份吧!

目录

一、工具介绍

mysqldump是mysql自带的逻辑备份工具。

它的备份原理是,通过协议连接到mysql数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert语句,当我们需要还原这些数据时,只要执行这些insert语句,即可将对应的数据还原。

二、工具特点

  • 免费备份工具
  • 支持远程备份
  • 支持生成CSV格式或XML格式的文件
  • 可以使用文本工具直接处理对应的备份数据,以更灵活便利的进行恢复工作
  • 与存储引擎无关,可以在多种存储引擎下进行备份恢复,对innodb引擎支持热备,对MyISAM引擎支持温备(施加表锁)
  • 当数据为浮点类型时,会出现精度丢失
  • 备份的过程是串行化的,不支持并行备份

三、备份权限

备份对象 权限
table SELECT
view SHOW VIEW
trigger TRIGGER
event EVENT
储存过程、函数 SELECT mysql.proc
转储用户 SELECT "mysql"系统库

备份未使用--single-transaction选项时,还需要LOCK TABLES权限

四、工具使用限制

  1. mysqldump转储时默认不会备份INFORMATION_SCHEMA, performance_schema, sys,如有需求转储,需要再命令行上显式的指定他们。

  2. mysqldump不会转储InnoDB CREATE TABLESPACE语句。

  3. mysqldump不会备份 NDB cluster ndbinfo信息数据库。

  4. 在启用了GTID的数据库中使用mysqldump备份时需要注意,如果备份文件中包含了GTID信息,则无法恢复到没有启用GTID的数据库中。

  5. Windows通过PowerShell使用如下命令进行转储时,转储文件默认使用UTF-16编码,而MySQL不允许将UTF-16作为连接字符集,所以通过如下命令备份的转储文件将无法正确加载到数据库中

    mysqldump [options] > dump.sql
  6. mysqldump是单线程,当数据量大时备份时间长,甚至有可能在备份过程中非事务表长期锁表对业务造成影响(SQL形式的备份数据恢复时间也较长)。

  7. 慎用 --compact 参数,此参数会去掉文件头与文件尾的一些参数设置(比如时区,字符集...),导致隐患。

  8. 参数 --lock-all-tables,--flush-privileges分别会在备份时进行 flush tables 和 flush privileges 操作,会产生GTID,备份从库时请注意。

  9. 在对数据库进行完全备份前,需要收集数据库相关信息(存储引擎、字符集等),确保备份内容完整,以下为收集语句:

    -- 查看表相关信息
    select table_schema,table_name,table_collation,engine,table_rows
    from information_schema.tables
    where table_schema NOT IN ('information_schema' , 'sys', 'mysql', 'performance_schema'); -- 查看是否存在存储过程、触发器、调度事件等
    select count(*) from information_schema.events;
    select count(*) from information_schema.routines;
    select count(*) from information_schema.triggers; -- 查看字符集信息
    show variables like 'character%';
  10. mysqldump的一些选项跟mysqlpump有些变化,在使用中需注意:

mysqldump mysqlpump
--routines、--events的别名分别为-R、-E --routines、--events不存在别名
存在master-data选项 不存在master-data选项,在进行构建主从需要通过master_auto_position来控制,不能够直观的通过指定binlog以及position来构建主从
-d的别名是--no-data -d的别名是--skip-dump-rows
转储文件默认带DROP TABLE语句 转储文件默认不带DROP TABLE、DROP USER(在使用--users备份用户时)语句,导入时可能会因为用户存在或者表存在而报错
备份不指定数据库或者-A会提示报错 备份不指定数据库或者-A,默认备份所有的数据。ps:除了INFORMATION_SCHEMA, performance_schema, ndbinfo, or sys

五、已知BUG

MySQL5.7.7至今(2020/11/02)的所有5.7的小版本,在使用mysqldump在执行--all-databases都会清空mysql.proc导致sys无法正常使用。

mysql> SELECT * FROM sys.processlist;
ERROR 1356 (HY000): View 'sys.processlist' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

在使用mysqldump在执行--all-databases不会备份mysql.proc下的系统自身的存储过程,导致导入到新机器后,部分sys下的视图没法正常使用;这是一个BUG,并且只存在于MySQL5.7。

bug连接:

如果因为使用--all-databases参数已经造成sys异常报错,这样做可以修复其异常:

mysql_upgrade --upgrade-system-tables --skip-verbose --force

-- 使用mysql_upgrade的时候要加上 --upgrade-system-tables。不然会扫描用户库表,期间加锁且速度一般。

六、备份前注意事项

6.1 需要长时间备份或导入时,请使用 screen 窗口工具

如果你正在做一个大表 DDL 或者批量执行一个 sql 文件,执行一半远程连接断开了,你会不会想吐血?如果刚好执行批量 sql 时没有开启事务,想想后果会怎样?

使用 screen 时,即使当前远程终端被断开连接,也不会中断正在执行的任务:

## 安装 screen
yum install -y screen ## 开启一个 screen
screen ## 查看所有开启的 screen
screen -ls ## 重新连接到指定的 screen
screen -r xxx

6.2 检查数据库参数

参数 原因
lock_wait_timeout 默认值为1年,如果没有修改默认设置,或者当前值是个挺长的时间,当mysqldump遇到长事务并在获取lock超时时,mysqldump不会退出,会等待获取MDL锁。此时界面无任何输出,使用者不进入数据库查看,不会感知备份停滞等待,影响备份工作进度

6.3 检查数据库角色

检查mysqldump备份角色,注意如果在从库使用下面mysqldump命令时,不要将--master-data和--flush-logs一起使用,有可能造成数据库死锁影响备份与复制。

7、使用方法举例

7.1 全库备份

注意不仅需要备份数据,还需要备份存储过程、触发器、事件:

mysqldump -uops -p -h127.0.0.1 -P4444 --default-character-set=utf8mb4 --single-transaction --master-data=2 --flush-logs --hex-blob --triggers --routines --events --all-databases > /tmp/backup/all_db_with_data.sql

注意:如果是MySQL5.7版本有BUG(详情请看五、已知BUG)需要多添加一步操作:

进行mysql.proc 单表导出:
mysqldump -uops -p -h127.0.0.1 -P4444 --default-character-set=utf8mb4 --single-transaction --master-data=2 --flush-logs --set-gtid-purged=off --hex-blob --triggers --routines --events --tables mysql proc > /tmp/backup/mysql_proc.sql

以上导出的SQL,必须在开启SET @@SESSION.SQL_LOG_BIN= 0;的情况下,利用mysql> source mysql_proc.sql的方式导入,否则会造成异常情况影响主从建立,如果不是为了创建主从,可忽略此导入方式。

进行mysql.proc 单表导入:
#不搭建主从复制的情况下:
多种导入方式都可
#要搭建主从复制的情况下:
mysql> use mysql
mysql> SET @@SESSION.SQL_LOG_BIN= 0;
mysql> source /tmp/backup/mysql_proc.sql

7.2 单库备份

## 备份表结构和数据
mysqldump -uops -p -h127.0.0.1 -P4444 --default-character-set=utf8mb4 --single-transaction --master-data=2 --flush-logs --set-gtid-purged=off --hex-blob --databases employees > /tmp/backup/employees_all.sql ## 只备份表结构
mysqldump -uops -p -h127.0.0.1 -P4444 --default-character-set=utf8mb4 --single-transaction --master-data=2 --flush-logs --set-gtid-purged=off --hex-blob --no-data --databases employees > /tmp/backup/employees_schema.sql ## 只备份数据
mysqldump -uops -p -h127.0.0.1 -P4444 --default-character-set=utf8mb4 --single-transaction --master-data=2 --flush-logs --set-gtid-purged=off --hex-blob --no-create-info --databases employees > /tmp/backup/employees_only_data.sql

7.3 单表备份

## 只备份employees数据库中的salaries表
mysqldump -uops -p -h127.0.0.1 -P4444 --default-character-set=utf8mb4 --single-transaction --master-data=2 --flush-logs --set-gtid-purged=off --hex-blob --tables employees salaries > /tmp/backup/employees_salaries.sql ## 排除指定数据库的指定表
mysqldump -uops -p -h127.0.0.1 -P4444 --default-character-set=utf8mb4 --single-transaction --master-data=2 --flush-logs --set-gtid-purged=off --hex-blob --ignore-table=employees.departments --ignore-table=employees.employees employees > /tmp/backup/employees_exclude_departments.sql

注意

如果备份时要排除某个数据库中多个表,要使用多个--ignore-table语句,不能在后面加逗号做分割。

7.4 生成单独的数据文件(-T)

mysqldump -uops -p -h127.0.0.1 -P4444 --default-character-set=utf8mb4 --single-transaction --master-data=2 --flush-logs -T /tmp/salaries --databases employees --tables salaries > employees_salaries.sql

注意事项

  • 该选项值指定的是生成表备份文件的目录。所以要如上所示添加--database --tables。该选项与--database、--all-databases选项互斥,不能一起使用
  • 只有当mysqldump与mysqld服务器在同一台机器上运行时,才能使用该选项

    因为在生成备份文件时只能使用本地目录,并且执行备份的MySQL账户还必须具有FILE权限。所以, secure_file_priv系统参数必须设置为空串(因为是调用 SELECT ...INTO OUTFILE语句),以使得启动mysqld进程的系统登录账户可以将这些备份文件生成到指定的文件系统目录下
  • (注意,使用该选项时指定的目录必须是备 份服务器上的目录,不能远程连接备份,因为SELECT ... INTO OUTIFLE 只能写到服务器本地目录下且启动 mysqld 进程的用户需要具有访问权限
生成文件示例:
less salaries/salaries.txt

10001   60117   1986-06-26      1987-06-26
10001 62102 1987-06-26 1988-06-25
10001 66074 1988-06-25 1989-06-25
10001 66596 1989-06-25 1990-06-25
10001 66961 1990-06-25 1991-06-25

7.5 根据条件备份(-w)

只转储由给定的WHERE条件选择的行

###按照where条件,备份指定库下的指定表的数据
mysqldump -uops -p -h127.0.0.1 -P4444 --default-character-set=utf8mb4 --single-transaction --master-data=2 -w 'id > 10 and id < 20' --databases testdb --tables sbtest1 > /tmp/backup/sbtest1.sql ###按照where条件,备份指定库下的所有表的数据
mysqldump -uops -p -h127.0.0.1 -P4444 --default-character-set=utf8mb4 --single-transaction --master-data=2 -w 'id > 10 and id < 20' --databases testdb > /tmp/backup/sbtest1.sql

注意事项

  1. 只用--database不用--table的情况下需注意:

    同一个库要所有的表都要有where条件列并且列数据类型一致。经测试同一个库下如果有一个表不具有where条件列,此时mysqldump会报错;经测试同一个库下如果有表,具有同名where条件列,但数据类型不同,此时mysqldump不会报错,但备份不出其数据,只会备份符合where条件的表的数据。
  2. 当只指定--tables而不指定--databases选项,或者在命令行选项中没有给出表示库名的参数时,mysqldump会把紧跟在--tables之后的命令行参数中的第一个当作库名来解析,从第二个参数开始全部被解析为表名。
  3. 如果多次指定一个备份对象,则不会去重,而是执行多次备份.所以,在生产环境中不建议库名与表名相同。

八、数据导入

8.1 备份导入前注意事项

(1) 在备份导入前要检查以下参数的配置
参数 建议 原因 命令
autocommit 建议开启 如果关闭,可能会造成导入语句无法自动提交,可能会导致事务卡住、事务回滚、binlog大事务,甚至数据库关闭。 set session autocommit = 1;
wait_timeout \ interactive_timeout 建议调大 设置过小,且导入时间长,会导致还没导入完,会话超时断开连接,导致任务失败。 set session wait_timeout=28800; \ set session interactive_timeout=28800;
(2) 检查SQL文件中所要DROP 的表是否是自己预期内的
less all_db_with_data.sql | grep -E "^DROP TABLE IF EXISTS|^USE"

8.2 使用PV工具监控文件导入过程

在一般的备份文件导入中,只能凭经验去估测一下备份文件实际导入的时间,这里可以使用PV工具,较为精确的算出导数剩余量及完成时间,所以建议使用此种方式,进行数据导入

#参数说明:
#-W:在需要密码输入时有用,可等待密码输出完成,再开启监控进度条
#-L:限流,将传输限制在每秒最大字节的范围内(大小可自定义,单位可变)
shell> pv -W -L 2M all_db_with_data.sql | /data/mysql/base/5.7.25/bin/mysql -uops -p -S/data/mysql/data/3333/mysqld.sock
Enter password:
588MiB 0:04:54 [ 2MiB/s] [======================================================>] 100%

8.3 mysql client+PV+会话参数导入(推荐)

#参数说明:
#reset master:在导入机器有自身的GTID时,会导入失败,所以可根据需要在echo里面添加"reset master"命令,清空GTID purge。 shell> (echo 'set @@autocommit=1; set @@interactive_timeout=28800; reset master;'; pv -W -L 5M all_db_with_data.sql) | mysql -h127.0.0.1 -P3333 -uops -p shell> (echo 'set @@autocommit=1; set @@interactive_timeout=28800;'; pv -W -L 5M employees_all.sql) | mysql -h127.0.0.1 -P3333 -uops -p employees

九、特殊问题规范

9.1 场景1:

防止SQL导入中产生过大的binlog,使主从延迟增加,想在导入时把日志格式改为statement,减小binlog

涉及参数:

transaction_isolation

binlog_format

注意问题:

如果表是InnoDB表,并且事务隔离级别是READ COMMITTED或READ UNCOMMITTED,那么只能使用基于行的日志记录。可以将日志格式改为statement,但在运行时这样做会导致错误,因为InnoDB表不能再执行insert语句。

mysql> select @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| STATEMENT |
+-----------------+
1 row in set (0.00 sec) mysql> show variables like '%iso%';
+-----------------------+----------------+
| Variable_name | Value |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
| tx_isolation | READ-COMMITTED |
+-----------------------+----------------+
2 rows in set (0.00 sec) mysql> create table test(id int, name varchar(20));
Query OK, 0 rows affected (0.02 sec) mysql> insert into test values(1, 'zhou'),(2, 'wei');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from test;
+------+------+
| id | name |
+------+------+
| 1 | zhou |
| 2 | wei |
+------+------+
2 rows in set (0.00 sec) mysql> insert into test values(3,'bing');
ERROR 1665 (HY000): Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.

在执行备份导入时有将binlog_format临时设置为statement需求时,需要检查transaction_isolation是否为RR。在RC级别下,binlog_format设置为statement会导致不能进行insert相关操作。所以不是RR级别,请不要将binlog_format改为statement。

9.2 场景2:

备份或导入SQL包过大,超过max_allowed_packet,备份或导入失败

涉及参数:

max_allowed_packet

注意问题:

备份或导入时确定数据库表中的字符类型:如果有BLOB列或长字符串等字符类型建议合理增加这个值。

#  mysqldump -h10.100.143.62 -umeslogin -P3306 -p --default-character-set=utf8mb4 --master-data=2 --flush-logs --single-transaction --set-gtid-purged=off --hex-blob --databases yfmes_metal_sys > yfmes_metal_sys_all.sql
mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `operlog` at row: 264227

导入时也相似的原理。

可以在mysql、mysqldump等client命令后临时修改此参数:

mysqldump [xxxx] --max_allowed_packet=256M > dump.sql
mysql [xxxx] --max_allowed_packet=256M < dump.sql

因为有悔,所以披星戴月;因为有梦,所以奋不顾身! 个人博客首发:easydb.net 微信公众号:easydb 关注我,不走丢!

mysqldump 使用规范的更多相关文章

  1. mysqldump备份、还原数据库路径名含有空格的处理方法(如:Program Files)

    虽然以下的方法也可以解决,不过最简单直接的,还是直接在路径前后加双引号-" ",这个方法简单有效. 首先要说明的是mysqldump.exe在哪里不重要,重要的是要处理好路径中的非 ...

  2. 【转】mysqldump与innobackupex知多少

    作者:罗小波 [目录] 1. 先看mysqldump 1.1 mysqldump备份过程解读 1.2 mysqldump备份过程中的关键步骤 1.2.1 FLUSH TABLES和FLUSH TABL ...

  3. mysqldump与innobackupex备份过程你知多少

    mysqldump与innobackupex备份过程你知多少 测试库表创建(这里在同一个库下创建两个表,一个表为innodb引擎,一个为myisam引擎) root@localhost : (none ...

  4. 【Shell脚本编程系列】知识储备以及建立规范的脚本

    前言 学习shell脚本编程需要的知识储备: vi/vim编辑器命令 vimrc设置要熟练 基础命令,100多个要熟练 基础和常用的网络服务命令要会:nfs . rsync. inotify . la ...

  5. 编写Shell脚本的最佳实践,规范二

    需要养成的习惯如下: 代码有注释 #!/bin/bash # Written by steven # Name: mysqldump.sh # Version: v1.0 # Parameters : ...

  6. 7-MySQL DBA笔记-研发规范

    第7章 研发规范 本章将为读者解读一份研发规范.为了更好地协同工作和确保所开发的应用尽可能的稳定.高效,建立一套数据库相关的研发规范是很有必要的,虽然研发规范的确立和推广是一项很耗时的工作,但所取得的 ...

  7. mysqldump中skip-tz-utc参数介绍

    前言: 在前面文章中,有提到过 mysqldump 备份文件中记录的时间戳数据都是以 UTC 时区为基础的,在筛选恢复单库或单表时要注意时区差别.后来再次查看文档,发现 tz-utc.skip-tz- ...

  8. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  9. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

随机推荐

  1. 简化mapstruct代码: mapstruct-spring-plus

    mapstruct MapStruct 是一个属性映射工具,只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现.MapStruct官网地址: h ...

  2. Mybatis 遍历 List<Map<String,Object>>

    在上一篇博客中总结了MyBatis Plus 实现多表分页模糊查询(链接在最后).返回类型是编写一个专门的vo类.这次是返回List < Map > 前言 ​ 编写一个专门的vo返回类,主 ...

  3. Docker配置阿里云镜像加速器及开启远程连接

    适用于CentOS-7版本 mkdir /etc/docker vim /etc/docker/deamon.json 添加以下内容配置镜像 { "registry-mirrors" ...

  4. TP之安全机制

    防止sql注入 1.查询条件尽量使用数组方式,具体如下: 1 $wheres = array(); 2 3 $wheres['account'] = $account; 4 5 $wheres['pa ...

  5. Webpack5构建速度提升令人惊叹,早升级早受益

    为什么要升级? webpack4用的好好的,运行稳定,为什么要升级到webpack5, 每次升级,都要经历一场地震,处理许多loader和plugin API的破坏性改变. 请给我们一个充分的升级理由 ...

  6. 是时候学习Linux了

    前言: Linux是一个开源.免费的操作系统.其稳定性.安全性.处理多并发已经得到业界的认可,目前很多企业级的项目都会部署到Linux/unix系统上.如果你还不太了解Linux,希望本篇文章能够带你 ...

  7. useradd linux系统创建用户和设置密码简单脚本-1

    useradd linux系统创建用户和设置密码简单脚本-1 linux_wangqiang 2019-12-04 20:51:18 65 收藏展开#!/bin/bash#快速创建用户 使用$1第一个 ...

  8. Ubuntu 20.04 版本安装

    Ubuntu 20.04 版本安装 安装步骤 首先创建好Ubuntu 20.04虚拟机 等待系统检查完整性 选择语言 选择不更新,回车确定 键盘语言默认即可 网卡IP配置 设置代理服务器 设置源 自定 ...

  9. g77介绍 g77 是 Fortran77 的编译器。它对 Fortran 77 标准提供完备的支持,并支持 Fortran 90 和 95 的部分特性。 由于 Fortran 77 标准在数值计算中的影响力,g77 可能是应用最广的Fortran编译器。 在 GCC 4.0 之前,g77 是 GCC 的一部分,但现在,g77 已经停止开发。

    GFORTRAN 维基百科,自由的百科全书     跳到导航 跳到搜索 此条目需要扩充. (2018年11月2日)请协助改善这篇条目,更进一步的信息可能会在讨论页或扩充请求中找到.请在扩充条目后将此模 ...

  10. 云计算OpenStack---创建实例(11)

    创建实例时,需要先创建网络及实例类型等其它配置: 一.创建虚拟网络(Self-service network) 网络概述图: 网络连接图: 1.创建self-service网络 (1)加载系统变量: ...