数据库及时备份可以帮助我们在数据库出现异常宕机时及时的使用备份数据进行恢复工作,将因为数据库宕机产生的影响降低到最小。上一篇针对使用xtrabackup工具进行物理备份和数据恢复做了一个详细讲解,本篇主要谈谈如何使用mysql自带的备份工具mysqldump进行逻辑备份和数据恢复。如果还围观看过上一篇文章的可以先行查询上一篇文章关于使用xtrabackup进行数据备份与恢复:Mysql备份与恢复(1)---物理备份。

前言
上一篇可能存在一个问题,最后一步恢复数据到/var/lib/mysql目录成功,但是最后重启数据库启动不起来,数据库日志一般存放路径为:/var/log/mysqld.log,经过定位日志可以查看到错误日志原因:

  • 2019-10-14T07:43:22.351861Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable

  • 2019-10-14T07:43:22.351885Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable

  • 2019-10-14T07:43:22.351892Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error

  • 2019-10-14T07:43:22.952508Z 0 [ERROR] Plugin 'InnoDB' init function returned error.

  • 2019-10-14T07:43:22.952596Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.

  • 2019-10-14T07:43:22.952606Z 0 [ERROR] Failed to initialize builtin plugins.

  • 2019-10-14T07:43:22.952613Z 0 [ERROR] Aborting

很明显是因为共享表文件ibdata1不可写,所以解决方案很简单:将/var/lib/mysql下的文件权限改成可写,使用命令:

  • chmod -R 777 /var/lib/mysql

然后重启mysql服务,可以发现mysql服务已经成功启动,而且备份数据也成功进行恢复了。

物理备份和逻辑备份的区别

逻辑备份

优点:

  • 备份成sql文件,恢复数据很简单。

  • 逻辑备份与存储引擎无关,所以可以通用备份。

  • 有助于避免数据损坏。

缺点:

  • 数据恢复速度较慢。

  • 需要数据库服务正常时安排cpu去进行还原操作。

物理备份

优点:

  • 容易跨平台,基于文件的物理备份。

  • 恢复数据很快,实际上就是将备份文件拷贝回原路径。

缺点:

  • 数据量大的话文件大。

  • 备份文件存储在磁盘本地,如果磁盘出问题容易造成备份文件丢失。

mysqldump逻辑备份

mysqldump是mysql自带的一个简单的备份工具,由于操作简单而且对不同的存储引擎通用,所以比较受欢迎。逻辑备份实际上是将数据库的数据被分成一个sql文件,然后恢复数据时只需要用图形化工具导入这个sql文件或者dos下使用source命令引入就可恢复数据。首先我们先看下mysqldump的基本语法:

  • mysqldump -uroot -proot -h127.0.0.1 -P3306 test test> test.sql

命令还有几个可传参数:

  • --all-databases:备份全部数据库。

  • -t:不导出创建表的语句。

  • -d:不导出数据。

  • -R:导出存储过程和函数。

  • --default-character-set:指定编码

  • --result-file:指定导出文件路径及文件名。

  • --skip-triggers:不导出触发器。

1. 备份前踩坑

如果系统中存在两个mysql版本,执行mysqldump命令就会报错,报错信息如下:

  • mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_QUOTE_SHOW_CREATE=1' at line 1 (1064)

首先使用mysqldump --version命令查看mysqldump当前版本,看是否和mysql版本一致:

  • mysqldump Ver 10.13 Distrib 5.5.29, for Win64 (x86)

再使用rpm -qa | grep -i mysql命令查看mysql版本

  • mysql-community-libs-5.7.27-1.el7.x86_64
  • mysql-community-server-5.7.27-1.el7.x86_64
  • mysql57-community-release-el7-8.noarch
  • mysql-community-common-5.7.27-1.el7.x86_64
  • mysql-community-libs-compat-5.7.27-1.el7.x86_64
  • perl-DBD-MySQL-4.023-6.el7.x86_64
  • mysql-community-client-5.7.27-1.el7.x86_64

可以看到mysql版本与mysqldump版本不一致造成的报错原因,使用whereis mysqld查看mysql安装路径:

  • /usr/local/mysql/bin/mysqld

然后将同处于bin目录下的mysqldump拷贝到/usr/bin/目录下覆盖旧版本的mysqldump即可解决版本不一致的问题:

  • cp /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump

2. 数据备份

刚才说过了命令,我们使用mysqldump是可以进行多种不同方案的备份的。接下来我们简单看几种备案方案:

(1) 全库备份:使用全库备份会将所有数据库中的数据全部备份到同一个sql文件中。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 --all-databases> /usr/local/all.sql

(2) 备份单个数据库:将lxy数据库中的数据备份到sql文件lxy.sql中。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 lxy> /usr/local/lxy.sql

(3) 备份lxy数据库中的users表到user_test.sql文件。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 lxy users> /usr/local/user_test.sql

(4) 只备份lxy数据库的表结构,不备份数据到lxy1.sql文件中。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 lxy -d> /usr/local/lxy1.sql

(5) 备份lxy数据库的表结构和存储过程,不备份数据到lxy2.sql中。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 lxy -d -R> /usr/local/lxy2.sql

(6) 不备份表结构,只备份数据到lxy3.sql。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 lxy -t> /usr/local/lxy3.sql

数据恢复

表级恢复

(1) 登录mysql,选择对应的数据库,然后设置编码。

(2) 使用source命令导入备份数据。

  • source /usr/local/all.sql

单库恢复

(1) 登录Mysql,删除要恢复的旧数据库。

(2) 使用source命令导入备份数据。

全库恢复

(1) 退出mysql,使用mysql命令恢复数据。

  • mysql < /usr/local/all.sql -p

然后在控制台输入密码,密码不会显示别以为没有输入成功。

mysqldump全量备份 + mysqlbinlog增量备份

刚才已经将mysql全量备份及数据恢复的方式讲完了,可以发现mysqldump的使用方式很简单,但是使用mysqldump进行数据备份会存在一个问题:恢复数据时会丢失掉从备份点开始的更新数据,所以我们需要结合mysqlbinlog进行二进制日志增量备份,首先修改/etc/my.cnf文件,在[mysqld]下启用二进制日志:

  • log_bin=mysql-bin

开启二进制日志,数据库的任何更新操作都会记录到二进制日志中。接下来看下mysqldump全量备份 + mysqlbinlog增量备份如何进行操作:

首先进行全量备份,添加--flush-logs参数生成新的二进制日志文件:

  • mysqldump --single-transaction --flush-logs --master-data=2 > /usr/local/all1.sql

所以说实际上备份有两个文件:mysqldump全量备份生成的/usr/local/all1.sql以及二进制日志文件/var/lib/mysql/mysql-bin.000003文件。所以恢复数据时,我们需要分成两部分去进行恢复数据:

先恢复全量备份的数据:

  • mysql < /usr/local/all1.sql -p

然后输入密码确认恢复数据。

然后恢复增量备份:

  • mysqlbinlog /var/lib/mysql/mysql-bin.000003 | mysql -p

这样就可以将数据恢复到恢复点时的数据。而且mysqlbinlog可以通过时间间隔来精确地恢复某个时刻的数据,我们看看bonlog几个可传参数:

  • --start-datetime:从某个时间点开始恢复数据

  • --stop-datetime:恢复截止到某个时间内的数据

  • --start-position:开始恢复数据的位置信息,位置信息可以从日志文件的log_pos中获取。

  • --end-position:截止恢复数据的位置信息,位置信息可以从日志文件的log_pos中获取。

比如我们需要恢复2019-01-01到2019-09-09的数据,我们在恢复增量日志时就可以这么书写mysqlbinlog命令:

  • mysqlbinlog --start-datetime="2019-01-01 00:00:00" --stop-datetime="2019-09-09 23:59:59" /var/lib/mysql/mysql-bin.000003 | mysql -p

欢迎关注公众号:程序猿周先森。

欢迎关注公众号:程序猿周先森。文章原创于微信公众号,本平台不定时更新。

Mysql备份与恢复(2)---逻辑备份的更多相关文章

  1. Mysql备份与恢复(1)---物理备份

    数据库对企业来说最重要的莫过于其中的数据,所以做好数据库的备份是一个不可或缺的工作.数据库及时备份可以帮助我们在数据库出现异常宕机时及时的使用备份数据进行恢复工作,将因为数据库宕机产生的影响降低到最小 ...

  2. MYSQL的备份与恢复--逻辑备份mysqldump

    目录 0.备份与恢复概述 1.逻辑备份-完整备份与恢复 2.逻辑备份-增量备份与恢复 (1)环境准备 (2)恢复全量数据 (3)恢复增量备份 3.新来的开发妹子删了库! (1)模拟环境准备 (2)全备 ...

  3. MySQL的备份与恢复理解与备份策略

    MySQL的备份主要分为逻辑备份和物理备份 逻辑备份 在MySQL中逻辑备份的最大优点是对各种存储引擎都可以用同样的方法来备份.而物理备份则不同,不同的存储引擎有着不同的备份方法.Mysql中的逻辑备 ...

  4. 【第八章】MySQL数据库备份—逻辑备份

    一.数据库备份 1.命令简介: # mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql1)关于数据库名: -A, --all-databases       ...

  5. Data Base mysql备份与恢复

    mysql  备份与恢复 为什么要备份: 由于系统使用到了MySQL 数 据库,所以每天的工作,就设计到了MySQL数据库的备份问题.但如果每天手工来做MySQL数据库的定时备份,工作量不说,时间还不 ...

  6. MySQL定时逻辑备份

    当项目数据量不大时,备份可以采用逻辑备份. 数据库可以搭建一主一从,从库每天凌晨三点全量逻辑备份. 然后同时记录二进制文件,用来进行基于时间点的数据恢复. 其他备份方案详见我的思维导图:MySQL备份 ...

  7. mysqldump常用于MySQL数据库逻辑备份

    mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump ...

  8. MySQL逻辑备份利器-mydumper

    关于mydumper的简介和下载请访问:https://launchpad.net/mydumper 简言之,mydumper是多线程逻辑备份,对于表和数据量很大的情况下,建议使用mydumper提高 ...

  9. mysql 开发进阶篇系列 48 物理备份与恢复(xtrabackup 的增量备份与恢复,以及备份总结)

    一.增量备份概述 xtrabackup  和innobackupex  二个工具都支持增量备份,这意味着能复制自上次备份以来更改的数据.可以在每个完整备份之间执行许多增量备份,因此,您可以设置一个备份 ...

随机推荐

  1. 使用 Laravel-Excel 进行 CSV/EXCEL 文件读写

    https://blog.csdn.net/yiluohan0307/article/details/80229978 http://www.ptbird.cn/laravel-excel-csv.h ...

  2. 使用react-tooltip实现鼠标悬浮显示框详细记录

    前段时间遇到的一个需求,要求鼠标悬停显示使用描述, 用到了react-tooltip插件,今天写一个总结 先看效果(为了方便参考,用的是原始样式): 文档参考地址: https://www.npmjs ...

  3. 什么是HOOK技术

    https://zhidao.baidu.com/question/50557962.html HOOK技术是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息 ...

  4. jquery实用应用之jquery操作radio、checkbox、select

    本文收集一些jquery的实用技巧,非常实用的哦,其中对radio.checkbox.select选中与取值的方法. 获取一组radio被选中项的值var item = $('input[@name= ...

  5. H3C PPP MP配置示例三

  6. Beta版是什么意思

    外部测试版的意思. 软件会出现三种版本 1.alpha内部测试版本,极不稳定,一般也不会出现的公众视线,仅供内部测试人员测试用. 2.beta公共测试版,就是对外发布软件的测试版,收集公众的意见和建议 ...

  7. Roslyn 静态分析

    本文告诉大家如何使用 Roslyn 分析代码 首先创建一个项目,项目使用.net Framework 4.6.2 ,控制台项目.然后需要安装一些需要的库 Nuget 安装 打开 Nuget 安装下面两 ...

  8. The bind() Method

    The bind() method was added in ESMAScript 5, but it is easy to simulate in ESMAScrpt 3. As its name ...

  9. js 正则匹配 两个字符串之间,某个字符串之前(之后)的内容

    1.js截取两个字符串之间的内容: var str = "aaabbbcccdddeeefff"; str = str.match(/aaa(\S*)fff/)[1]; alert ...

  10. H3C擦除配置