Hi,大家好,我是麦洛,今天我们聊聊MySQL
的备份和恢复,在下面文章中,你会了解到MySQL
常见的备份类型,以及基于mysqldump
命令在日常开发中如何做MySQL
数据库以及表的备份和恢复。
物理备份指将数据库内容的目录和数据文件、日志文件及配置文件的原始副本全部备份,适用于大型重要的数据库在出现问题时需要快速恢复的场景。
MySQL
数据目录的全部或部分副本。MySQL
服务器停止时执行备份。 如果服务器正在运行,则需要执行适当的锁定,以便服务器在备份期间不更改数据库内容。 MySQL Enterprise Backup
(MySQL
提供企业级备份和恢复。 它可以在多种平台上提供热备份、在线备份和非阻塞备份)可以自动锁定需要备份的表。mysqlbackup
(MySQL Enterprise Backup
组件的一部分),或 MyISAM
表的文件系统命令(如 cp、 scp、 tar、 rsync
)。MySQL Enterprise Backup
恢复 InnoDB
和其他已备份的表NDB
表(NDB
引擎)逻辑备份是指将数据库的逻辑结构(CREATE DATABASE
、 CREATE TABLE
语句)和内容(INSERT
语句或带分隔符的文本文件)备份。 它适用于小量的数据,我们可以直接编辑备份的数据,修改表结构或者内容,然后在不同的服务器上面重新构建数据;
MySQL
服务器获取数据库表结构和表内容信息来完成的。MySQL
服务器的情况下执行的。服务器不需要停机。mysqldump
程序和 SELECT... INTO OUTFILE
语句。mysql
客户端(Navicat
)处理 sql
格式的转储文件。 若要加载带分隔符的文本文件,请使用 loaddata
语句或 mysqlimport
客户端。在 MySQL
服务器运行期间进行备份,称为在线备份。反之服务器停止时进行备份。称为离线备份。 通常也可以称为“热备份”和“冷备份” ;
MySQL
服务器,并且可以访问数据。MySQL Enterprise Backup
产品会自动执行这种锁定。在备份期间,客户端能够在备份数据时读取数据。 恢复修改数据并且不只是读取数据,因此在还原数据时必须阻止客户端访问数据。
本地备份指在运行 MySQL
服务器的同一台主机上执行备份操作,而远程备份是在另一台主机上执行备份操作。 对于某些类型的备份,即使备份输出是在服务器上,但可能是从远程主机启动备份。
mysqldump
可以连接到本地或远程服务器。SELECT ... INTO OUTFILE
可以从本地或远程客户端主机启动 SELECT... INTO OUTFILE
,但是输出文件是在服务器主机上创建的。更多内容阅读:
mysqldump : https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
SELECT ... INTO OUTFILE : https://dev.mysql.com/doc/refman/5.7/en/select-into.html
完全备份指备份 MySQL
服务器在给定时间点管理的所有数据。 增量备份指备份给定时间范围内(从一个时间点到另一个时间点)对数据所做的更改。 Mysql
有不同的方法来执行完全备份,如前面所述。 通过启用 MySQL
服务器的binlog
二进制日志(服务器用于记录数据更改) ,可以进行增量备份。
完全恢复还原备份的所有数据。这会将服务器的数据恢复到备份时的状态。如果该状态不是当前的,可以在完全恢复之后进行增量恢复,从而使服务器达到更新的状态。
增量恢复是对给定时间跨度内所做的更改进行恢复。这也称为时间点恢复。时点恢复基于binlog二进制日志,通常在完全恢复备份文件之后进行,然后将写入二进制日志文件中的数据更改作为增量恢复应用于重做数据修改,并将服务器带到所需的时间点。
首先,我们看看我们的演示数据
进入MySQL
安装bin
目录下面执行命令,接下来操作保持一致
C:\Program Files\MySQL\MySQL Server 5.7\bin>mysqldump --all-databases --hex-blob >d:\alldatabases.sql
结果:
mysqldump --databases girls > d:\girls.sql
结果:
说明:
在单数据库情况下,可以忽略以下 --databases
选项
如果不带此选项,生成文件会不包含CREATE DATABASE
mysqldump girls boys >d:\boys.sql
结果:
如果备份文件是由mysqldump
使用 --all-databases
或 --databases
选项创建的 ,则备份文件包含CREATE DATABASE
和 USE
语句,所以无需指定默认数据库就可以直接将数据重载;
首先,我们删库跑路…
C:\Program Files\MySQL\MySQL Server 5.7\bin>mysql
结果:
备份文件不包含CREATE DATABASE
和 USE
语句 ,请首先创建数据库(如有必要):
#创建数据库db1
mysqladmin create db1
结果:(关闭数据库连接,重复开启,皆可以看到)
我们重新生成一个不不包含CREATE DATABASE
和 USE
语句的文件
mysqldump girls > d:\nodatabasegirls.sql
彩蛋:如果遇到这个,就重启下mysql
服务吧,我也不知道为什么,哈哈
mysqldump: Got error: 1045: Access denied for user 'ODBC'@'localhost' (using password: NO) when trying to connect
向db1
数据库重载我们的数据
mysql db1
结果:
shell> mysqldump db1 > dump.sql
shell> mysqladmin create db2
shell> mysql db2 < dump.sql
# 在服务器1上:
shell> mysqldump --databases db1 > dump.sql
# 在服务器2上:
shell> mysql < dump.sql
# 您可以--databases从 mysqldump命令中省略,然后自己创建数据库
# 在服务器1上:
mysqldump db1 > dump.sql
# 在服务器2上:
shell> mysqladmin create db1
shell> mysql db1 < dump.sql
# 不转储表数据
shell> mysqldump --no-data test > dump-defs.sql
#不输出CREATE语句,只包含表数据
shell> mysqldump --no-create-info test > dump-data.sql
在考虑进行MySQL
升级时,应将新版本与当前生产版本分开安装。然后,您可以从生产服务器中转储数据库和表定义,并将它们加载到新服务器中,以验证它们是否正常。(这对于测试降级也很有用。)
#生产服务器
shell> mysqldump --all-databases --no-data --routines --events > dump-defs.sql
#升级服务器
shell> mysql < dump-defs.sql
验证表定义正常后,在导入数据测试
#生产服务器
shell> mysqldump --all-databases --no-create-info > dump-data.sql
#升级服务器
shell> mysql < dump-data.sql
这时候,可以进行一些简单查询测试,观察是否正常
在本文中,我们只是简单介绍了mysqldump
的基础操作,关于它的选项总共有113
个,大家可以根据自己需要自行去官网https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
查阅学习
笔者麦洛是java
开发者和技术爱好者,目前关注java
、Spring
、微服务、云原生方向。为了将内容精准推给喜欢我的小伙伴,在大家建议下开通了公众号。喜欢的小伙伴可以关注我,第一时间获取文章信息。也可以后台回复加群加入交流群,大家一起进步!谢谢大家对我的支持。