0

0

使用mysqldump进行mariadb的备份

php中文网

php中文网

发布时间:2016-06-07 14:56:09

|

1470人浏览过

|

来源于php中文网

原创

mysqldump备份介绍 mysqldump 是 mysql 用于转存储数据库的实用程序。它主要产生一个 SQL 脚本 ,其中包含从头重新创建数据库所必需的命令 CREATE TABLE INSERT 等,适用于备份数据量不大的数据库。 优点:备份简单,恢复容易。 备份缺点:schema和数据存储

mysqldump备份介绍

mysqldumpmysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等,适用于备份数据量不大的数据库。

优点:备份简单,恢复容易。

备份缺点:schema和数据存储在一起,巨大的SQL语句、单个巨大的备份文件(备份的库和表都在一个文件中)。


mysqldump: 是一个mysql客户端命令,通过mysql协议连接至mysqld,实现数据库备份

命令的语法格式:

   mysqldump [OPTIONS] database [tables]:备份单个库,或库指定的一个或多个表

mysqldump[OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]:备份一个或多个库

mysqldump[OPTIONS] --all-databases [OPTIONS]:备份所有库

常用选项:

    -A,--all-databases       #备份所有数据库

    InnoDB:

        --single-transaction:启动一个大的单一事务实现备份

     -B,--databases db_name1 db_name2 ...:备份指定的数据库

     -C,--compress:压缩传输;

     -x, --lock-all-tables:锁定所有表

     -l, --lock-tables:锁定备份的表

     --flush-logs,-F:锁定表之后执行flush logs命令;

其它选项:

    -E,--events:备份指定库的事件调度器;

    -R,--routines:备份存储过程和存储函数;

    --triggers:备份触发器

 

    --master-data[=#]

        1:记录CHANGE MASTER TO语句;此语句未被注释;

        2:记录为注释语句;


特别说明:Mariadb的数据恢复严重依赖与bin-log日志,所以为了防止磁盘故障导致数据文件和bin-log文件一起丢失,所以最好将bin-log日志存放到共享存储中。

设置方法:修改Mariadb配置文件,将日志文件存放位置指向本地挂载网络存储的路径,然后重启Mariadb服务即可。

[root@MariaDB ~]# vim /etc/my.cnf
log-bin="/backup/bin-log/mysql-bin.x"

验证:重启服务之后/backup/bin-log/目录下就有了Mysql的二进制日志文件和日志索引文件。

[root@MariaDB ~]# ll /backup/bin-log/mysql-bin.*
-rw-rw---- 1 mysql mysql 245 Jun 16 00:00/backup/bin-log/mysql-bin.000001
-rw-rw---- 1 mysql mysql  33 Jun 16 00:00/backup/bin-log/mysql-bin.index

单个库实现备份恢复

数据库中有hellodb表一个,需要做对hellodb表的备份,以实现数据库故障或者发生误删除操作时可以及时恢复数据库。

备份方案为:每周日完全备份一次数据库,周一到周六增量备份数据库

备份过程如下

第一天备份:完全备份hellodb数据库,并且在完全备份的时候锁定表和滚动二进制日志

[root@MariaDB~]# mysqldump -B hellodb -u root -p --lock-all-tables --flush-logs  --master-data=2 > /backup/hellodb-`date+%F`.sql
Enterpassword: 
[root@MariaDB~]# ll /backup/
total8
-rw-r--r--1 root root 7950 Jun 16 11:59 hellodb-2015-06-16.sql

由于在做完全备份的时候滚动了二进制日志,所以在做一些关于数据库更改的操作都会记录到新的二进制日志中,从查看中得知后续日志会记录到mysql-bin.000002中。

MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name        | File_size |
+------------------+-----------+
| mysql-bin.000001 |       288 |
| mysql-bin.000002 |       245 |
+------------------+-----------+
2 rows in set (0.00 sec)

备份完成之后的一天时间里,创建了一张表,并且向表中插入了一些数据

MariaDB[(none)]> use hellodb;
MariaDB[hellodb]> create table tb1 (id int);
MariaDB[hellodb]> insert into tb1 values (1),(2),(3);
MariaDB[hellodb]> select * from tb1;
+------+
|id   |
+------+
|    1 |
|    2 |
|    3 |
+------+

第一天增量备份:当天的所有对数据库进行更改的语句都会记录到二进制日志文件中,只需要滚动二进制日志,把二进制日志进行备份即可,二进制滚动之后,第二天的所有对数据库进行更改的语句,都会记录到新的二进制日志文件中。

MariaDB[hellodb]> flush logs;
MariaDB [hellodb]> show master logs;
+------------------+-----------+
| Log_name        | File_size |
+------------------+-----------+
| mysql-bin.000001 |       288 |
| mysql-bin.000002 |       577 |
| mysql-bin.000003 |       245 |
+------------------+-----------+
3 rows in set (0.00 sec)

将二进制日志文件转换为sql文件

[root@MariaDB ~]# mysqlbinlog/backup/bin-log/mysql-bin.000002 > /backup/1.sql

第二天操作:继续向tb1中插入数据

MariaDB[hellodb]> insert into tb1 values (21),(22),(23);
MariaDB[hellodb]> select * from tb1;
+------+
|id   |
+------+
|    1 |
|    2 |
|    3 |
|   21 |
|   22 |
|   23 |
+------+

故障模拟

hellodb数据库遭到误删除:

MariaDB[hellodb]> DROP database hellodb;

恢复前的准备

查看二进制日志是记录到了第三个日志

MariaDB[(none)]> show master logs;
+------------------+-----------+
|Log_name         | File_size |
+------------------+-----------+
|mysql-bin.000001 |       288 |
|mysql-bin.000002 |       577 |
|mysql-bin.000003 |       533 |    #当前日志的记录位置
+------------------+-----------+
3rows in set (0.00 sec)
MariaDB[(none)]> show binlog events in 'mysql-bin.000003'\G;
***************************5. row ***************************
   Log_name: mysql-bin.000005
        Pos: 446
 Event_type: Query
  Server_id: 1
End_log_pos:533
       Info: DROP database hellodb      #记录的删除语句
5rows in set (0.00 sec)
 
ERROR:No query specified



由于是整个hellodb数据库遭到误删除,所以需要用一开始的完全备份文件,以及第一天的增量备份文件,恢复hellodb数据库和第一天对数据库进行修改的内容。

第二天对数据库进行修改的内容恢复:如果直接把当天的二进制日志导入到数据库,由于数据库中包含了删除语句,所以数据库还是会被删除;所以在导入第二天二进制日志时,需要删除日志中的DROP语句。

 

将第二天的二进制日志文件转换成sql文件,放到backup目录下

MMM金融互助系统源码
MMM金融互助系统源码

MMM金融互助系统源码是以thinkphp为核心进行开发的3m金融互助平台。程序安装说明:1.恢复数据:将“数据备份”文件夹中的 urkeji.sql 文件请采用phpMyAdmin进行导入; 2.配置Sql数据库信息,文件路径:根目录下 config.php3.后台管理地址:http://域名/admin.php 用户名:100000 密码:admin1

下载
[root@MariaDB~]# mysqlbinlog /backup/bin-log/mysql-bin.000003 > /backup/2.sql

打开2.sql文件可以看到DROP语句,删除这个语句

# at446
#15061612:15:22 server id 1  end_log_pos 533   Query  thread_id=20    exec_time=0     error_code=0
SETTIMESTAMP=1434428122/*!*/;
DROP database hellodb   #删除或者注释这一行

恢复过程:

恢复之前为了避免产生没有用的二进制日志,可以关闭二进制日志的记录

MariaDB[(none)]> SET SESSION sql_log_bin=0;

将第一次的完全备份数据导入到数据库

MariaDB [hellodb]> SOURCE /backup/hellodb-2015-06-16.sql;

查看数据库已经导入,但是tb1表不存在

MariaDB[(none)]> use hellodb;
Databasechanged
MariaDB[hellodb]> show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|toc               |
+-------------------+

导入第一天增量备份的1.sql文件。

MariaDB [hellodb]> SOURCE /backup/1.sql;

查看tb1表,发现第一天插入的数据都存在

MariaDB[hellodb]> select * from tb1;
+------+
|id   |
+------+
|    1 |
|    2 |
|    3 |
+------+

导入当天的2.sql文件

MariaDB [hellodb]> SOURCE /backup/2.sql;

查看数据已经完全恢复

MariaDB[hellodb]> select * from tb1;
+------+
|id   |
+------+
|    1 |
|    2 |
|    3 |
|   21 |
|   22 |
|   23 |
+------+

恢复完成,启用记录二进制日志

MariaDB[hellodb]> SET SESSION sql_log_bin=1;

特别说明:如果在恢复中关闭二进制日志,导入数据必须在Mariadb命令行导入,如果在shell命令行导入还是会记录二进制日志的。


全库的备份恢复

备份

第一次完全备份,备份时锁定表,并滚动二进制日志

[root@MariaDB ~]# mysqldump -A -u root -p--lock-all-tables --flush-logs --master-data=2 > /backup/ALL-`date +%F`.sql
Enter password:
[root@MariaDB ~]# ll /backup/
total 532
-rw-r--r-- 1 root root    1980 Jun 16 00:46 1.sql
-rw-r--r-- 1 root root    1957 Jun 16 00:52 2.sql
-rw-r--r-- 1 root root  521774 Jun 16 01:04ALL-2015-06-16.sql
drwxr-xr-x 2 mysql mysql   4096 Jun 16 01:04 bin-log
-rw-r--r-- 1 root root    7950 Jun 16 00:43hellodb-2015-06-16.sql

由于备份的时候滚动了二进制日志,所以备份之后所有对数据库产生更改的操作都会记录到mysql-bin.000004中。

MariaDB [hellodb]> show master logs;
+------------------+-----------+
| Log_name        | File_size |
+------------------+-----------+
| mysql-bin.000001 |       288 |
| mysql-bin.000002 |       577 |
| mysql-bin.000003 |      8833 |
| mysql-bin.000004 |       245 |
+------------------+-----------+
4 rows in set (0.00 sec)

备份完成的当天做了一些操作。

MariaDB[hellodb]> delete from tb1 where id=21;
MariaDB[hellodb]> delete from tb1 where id=22;
MariaDB[hellodb]> select * from tb1;
+------+
|id   |
+------+
|    1 |
|    2 |
|    3 |
|   23 |
+------+


第一天增量备份

当天的所有对数据库进行更改的语句都会记录到二进制日志文件中,只需要滚动二进制日志,把二进制日志进行备份即可,二进制滚动之后,第二天的所有对数据库进行更改的语句,都会记录到新的二进制日志文件中。

MariaDB [hellodb]> flush logs;
MariaDB [hellodb]> show master logs;
+------------------+-----------+
| Log_name        | File_size |
+------------------+-----------+
| mysql-bin.000001 |       288 |
| mysql-bin.000002 |       577 |
| mysql-bin.000003 |      8833 |
| mysql-bin.000004 |       670 |
| mysql-bin.000005 |       245 |
+------------------+-----------+
5 rows in set (0.00 sec)

将第一天的二进制日志文件转换为sql文件

[root@MariaDB ~]# mysqlbinlog /backup/bin-log/mysql-bin.000004> /backup/all.1.sql

 

第二天对数据进行了一些操作

MariaDB[hellodb]> insert into tb1 values (1000),(9000);
MariaDB[hellodb]> select * from tb1;
+------+
|id   |
+------+
|    1 |
|    2 |
|    3 |
|   23 |
|1000 |
|9000 |
+------+

模拟故障

删除数据目录下的所有文件,模拟数据库故障:

[root@MariaDB ~]# rm -rf /mydata/data/*

数据库这个时候还可以登录,但是数据库都不再了

MariaDB [hellodb]> show databases;
+--------------------+
| Database          |
+--------------------+
| information_schema |
+--------------------+

 

恢复前的准备

发现数据库故障先关闭数据库,但是数据库无法正常关闭,只能关闭进程

[root@MariaDB ~]# service mysqld stop
MySQL server PID file could not be found!                  [FAILED]
[root@MariaDB ~]# killall mysqld

 

由于数据库数据目录的所有内容被删除,就算是导入了完全备份文件也是缺少一些文件,解决方法就是重新初始化一下数据库。

[root@MariaDB ~]# cd /usr/local/mysql/
[root@MariaDB mysql]# scripts/mysql_install_db--user=mysql --datadir=/mydata/data/

初始化完成之后,一些基本的文件都存在了

[root@MariaDB mysql]# ll /mydata/data/
total 36
-rw-rw---- 1 mysql mysql 16384 Jun 16 01:22aria_log.00000001
-rw-rw---- 1 mysql mysql    52 Jun 16 01:22 aria_log_control
-rw-r----- 1 mysql root     80 Jun 16 01:18 MariaDB.err
drwx------ 2 mysql root   4096 Jun 16 01:22 mysql
drwx------ 2 mysql mysql  4096 Jun 16 01:22 performance_schema
drwx------ 2 mysql root   4096 Jun 16 01:22 test

 

将第二天的二进制日志文件转换为sql文件

[root@MariaDB ~]# mysqlbinlog/backup/bin-log/mysql-bin.000005 > /backup/all.2.sql

恢复过程

恢复之前启动Mysql服务,否则无法导入备份文件

[root@MariaDB ~]# service mysqld start

导入第一天的完全备份文件,由于刚刚初始化完成数据,这个时候的数据库还没有密码

[root@MariaDB ~]# mysql </backup/ALL-2015-06-16.sql

登录数据库查看,所有的数据库都已经恢复,但是第一天对数据库更改的内容还是没有恢复

MariaDB [(none)]> show databases;
+--------------------+
| Database          |
+--------------------+
| information_schema |
| hellodb           |
| mysql             |
| performance_schema |
| test              |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [hellodb]> select * from tb1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|   21 |
|   22 |
|   23 |
+------+
6 rows in set (0.00 sec)

导入第一天的增量备份文件

[root@MariaDB ~]# mysql -u root -p < /backup/all.1.sql

发现第一天删除的文件已经不存在,但是第二天添加的内容还是没有

MariaDB [hellodb]> select * from tb1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|   23 |
+------+
4 rows in set (0.00 sec)

导入第二天的二进制日志转换后的sql文件。

[root@MariaDB ~]# mysql -u root -p </backup/all.2.sql

导入完成之后,数据库就回到了故障之前的状态

MariaDB [hellodb]> select * from tb1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|   23 |
| 1000 |
| 9000 |
+------+
6 rows in set (0.00 sec)

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

65

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

57

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

44

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

23

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

20

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

4

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

336

2026.02.27

deepseek在线提问
deepseek在线提问

本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

90

2026.02.27

AO3官网直接进入
AO3官网直接进入

AO3官网最新入口合集,汇总2026年可用官方及镜像链接,助你快速稳定访问Archive of Our Own平台。阅读专题下面的文章了解更多详细内容。

529

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 12.5万人学习

CSS3 教程
CSS3 教程

共18课时 | 6.4万人学习

Git 教程
Git 教程

共21课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号