title: 几种常见数据库的备份与恢复
date: 2022-05-24 15:47:27
MySQL的数据备份与恢复 #
1. 数据的备份类型 #
数据的备份类型根据其自身的特性主要分为以下几组:
-
1.完全备份 完全备份指的是备份整个数据集( 即整个数据库 )
-
2.部分备份 部分备份指的是备份部分数据集(例如: 只备份一个表) 而部分备份又分为:
- 增量备份 增量备份指的是备份自上一次备份以来(增量或完全)以来变化的数据。特点: 节约空间、还原麻烦
- 差异备份 差异备份指的是备份自上一次完全备份以来变化的数据。特点: 浪费空间、还原比增量备份简单
2. MySQL备份数据的方式 #
在MySQl中备份数据一般有三种方式:
-
热备份 热备份指的是当数据库进行备份时, 数据库的读写操作均不是受影响
-
温备份 温备份指的是当数据库进行备份时, 数据库的读操作可以执行, 但是不能执行写操作
-
冷备份 冷备份指的是当数据库进行备份时, 数据库不能进行读写操作, 即数据库要下线
MySQL中进行不同方式的备份还要考虑存储引擎是否支持: 1)MyISAM 热备 × 温备 √ 冷备 √ 2)InnoDB 热备 √ 温备 √ 冷备 √
我们考虑完数据备份, 数据库的运行状态之后还需要考虑对于MySQL数据库中数据的备份方式:
- (1)物理备份 物理备份一般就是通过tar,cp等命令直接打包复制数据库的数据文件达到备份的效果
- (2)逻辑备份 逻辑备份一般就是通过特定工具从数据库中导出数据并另存备份(逻辑备份会丢失数据精度)
3.备份工具 #
常用的备份工具有:
- mysqldump: 逻辑备份工具, 适用于所有的存储引擎, 支持温备、完全备份、部分备份、对于InnoDB存储引擎支持热备
- cp, tar 等归档复制工具: 物理备份工具, 适用于所有的存储引擎, 冷备、完全备份、部分备份
- lvm2 snapshot: 几乎热备, 借助文件系统管理工具进行备份
- mysqlhotcopy: 名不副实的的一个工具, 几乎冷备, 仅支持MyISAM存储引擎
- xtrabackup: 一款非常强大的InnoDB/XtraDB热备工具, 支持完全备份、增量备份, 由percona提供
下面介绍一下mysqldump的使用
4. mysqldump 的介绍与使用 #
mysqldump 属于逻辑备份,也是最常见的备份工具了
备份实例 #
# 备份整个数据库
mysqldump -u root -h host -p dbname > backdb.sql
# 备份数据库中的某个表
mysqldump -u root -h host -p dbname tbname1, tbname2 > backdb.sql
# 备份多个数据库
mysqldump -u root -h host -p --databases dbname1, dbname2 > backdb.sql
# 备份系统中所有数据库
mysqldump -u root -h host -p --all-databases > backdb.sql
还原 #
mysql命令导入sql文件还原
# 在系统命令行中,输入如下实现还原:
mysql -u root -p dbname < backup.sql
# 在登录进入mysql系统中,通过source指令找到对应系统中的文件进行还原:
MYSQL> source backup.sql;
MongoDB的数据备份与恢复 #
MongoDB 备份的几种方式:
- mongodump
- 系统快照(这里不做详细介绍,具体内容见官网:Back Up with Filesystem Snapshots)
- cp 或者 rsync
mongodump的介绍与使用 #
1. mongodump概述 #
mongodump 是 MongoDB 官方提供的备份工具,它可以从 MongoDB 数据库读取数据,并生成 BSON 文件,mongodump 适合用于备份和恢复数据量较小的 MongoDB 数据库,不适用于大数据量备份。
默认情况下 mongodump 不获取 local 数据库里面的内容。
mongodump 仅备份数据库中的文档,不备份索引,所以我们还原后,需要重新生成索引。
mongodump 备份过程中会对 mongod 服务的性能产生影响,我们建议在业务低峰期进行操作。如果我们备份的数据,大于系统内存,我们备份的时候容易出现错误。
在执行 mongodump 的时候,mongod 服务还是可以提供服务的,可以进行修改数据,如果我们在备份的时候加上参数 –oplog 的话,那么 oplog 是会记录这一次操作的,如果我们想在 restore 的时候也有日志记录,我们可以使用 mongorestore –oplogReplay 进行恢复
mongodump常用命令和参数 #
官方文档:mongodump
mongodump 默认输出的目录名为 dump ,如果输出路径包含 dump 目录,会直接覆盖的。 默认备份是没有压缩的。
参数:
--host <hostname><:port>, -h <hostname><:port> # 指定备份的主机ip和端口号,默认值localhost:27017
--port # 指定端口号 默认27017
--username <username>, -u <username> # 指定用户名
--password <password>, -p <password> # 指定密码
--authenticationDatabase <dbname> # 指定认证的数据库
--authenticationMechanism <name> # 指定认证的算法 ,默认值 SCRAM-SHA-1
--db <database>, -d <database> # 指定备份的数据库,未指定的话,备份所有的数据库,但不包含local库
--collection <collection>, -c <collection> # 指定备份的集合,未指定则备份指定库中的所有集合。
--query <json>, -q <json> # 指定 json 作为查询条件。来备份我们过滤后的数据。
--queryFile <path> # 指定 json 文档路径,以该文档的内容作为查询条件,来备份我们过滤后的数据。
--quit # 通过抑制 MongoDB的复制,连接等活动,来实现备份。
--gzip # 开启压缩,3.2版本后可以使用,输出为文件的话会带有后缀.gz
--out <path>, -o <path> # 输出的目录路径
--repir # 修复数据时使用 下面有详细介绍
--oplog # mongodump 会将 mongodump 执行期间的 oplog 日志 输出到文件 oplog.bson,这就意味着从备份开始到备份结束的数据操作我们都可以记录下来。
--archive <file> # 输出到单个存档文件或者是直接输出。
--dumpDbUsersAndRoles # 只有在 使用 --db 时才适用,备份数据库的包含的用户和角色。
--excludeCollection string # 排除指定的集合,如果要排除多个,使用多个--excludeCollection
--numParallelCollections int, -j int # 并行导出的集合数,默认为4
--ssl # 指定 TLS/SSL 协议
--sslCAFile filename # 指定认证文件名
--sslPEMKeyFile <filename>
--sslPEMKeyPassword <value>
--sslCRLFile <filename>
--sslAllowInvalidCertificates
--sslAllowInvalidHostnames
--sslFIPSMode
备份示例: #
语法:mongodump -h host:port -d dbname -o dbdirectory
-h:数据库服务器地址+服务端口
-d:要备份的数据库的名称
-c:备份的数据表
-o:备份数据库的存放目录
如果数据库开启了登录认证,则需要添加用户认证信息
# 导出指定数据库到指定目录
mongodump -h 127.0.0.1:27017 -u=账号 -p=密码 --authenticationDatabase=admin -d deployservice -o /data/backup/mongodump-2024-5-16/
root@c02e337bf417:/# ls
bin data docker-entrypoint-initdb.d etc js-yaml.js lib32 libx32 mnt proc run srv tmp var
boot dev dump home lib lib64 media opt root sbin sys usr
root@c02e337bf417:/# mongodump -h 127.0.0.1:27017 -u=admin -p=123456 --authenticationDatabase=admin -d deployservice -o /data/backup/mongodump-2024-5-16
2024-05-16T08:37:30.456+0000 writing deployservice.deploys to /data/backup/mongodump-2024-5-16/deployservice/deploys.bson
2024-05-16T08:37:30.457+0000 writing deployservice.records to /data/backup/mongodump-2024-5-16/deployservice/records.bson
2024-05-16T08:37:30.457+0000 writing deployservice.services to /data/backup/mongodump-2024-5-16/deployservice/services.bson
2024-05-16T08:37:30.479+0000 done dumping deployservice.services (72 documents)
2024-05-16T08:37:30.479+0000 writing deployservice.loopholes to /data/backup/mongodump-2024-5-16/deployservice/loopholes.bson
2024-05-16T08:37:30.504+0000 done dumping deployservice.loopholes (59 documents)
2024-05-16T08:37:30.504+0000 writing deployservice.backups to /data/backup/mongodump-2024-5-16/deployservice/backups.bson
2024-05-16T08:37:30.545+0000 done dumping deployservice.backups (27 documents)
2024-05-16T08:37:30.545+0000 writing deployservice.servers to /data/backup/mongodump-2024-5-16/deployservice/servers.bson
2024-05-16T08:37:30.566+0000 done dumping deployservice.servers (13 documents)
2024-05-16T08:37:30.567+0000 writing deployservice.vulnerabilities to /data/backup/mongodump-2024-5-16/deployservice/vulnerabilities.bson
2024-05-16T08:37:30.568+0000 writing deployservice.logs to /data/backup/mongodump-2024-5-16/deployservice/logs.bson
2024-05-16T08:37:30.574+0000 done dumping deployservice.records (596 documents)
2024-05-16T08:37:30.575+0000 writing deployservice.users to /data/backup/mongodump-2024-5-16/deployservice/users.bson
2024-05-16T08:37:30.587+0000 done dumping deployservice.vulnerabilities (10 documents)
2024-05-16T08:37:30.588+0000 writing deployservice.sessioninfos to /data/backup/mongodump-2024-5-16/deployservice/sessioninfos.bson
2024-05-16T08:37:30.592+0000 done dumping deployservice.users (8 documents)
2024-05-16T08:37:30.592+0000 writing deployservice.migrations to /data/backup/mongodump-2024-5-16/deployservice/migrations.bson
2024-05-16T08:37:30.604+0000 done dumping deployservice.sessioninfos (5 documents)
2024-05-16T08:37:30.605+0000 writing deployservice.vdbs to /data/backup/mongodump-2024-5-16/deployservice/vdbs.bson
2024-05-16T08:37:30.609+0000 done dumping deployservice.migrations (4 documents)
2024-05-16T08:37:30.610+0000 writing deployservice.settings to /data/backup/mongodump-2024-5-16/deployservice/settings.bson
2024-05-16T08:37:30.625+0000 done dumping deployservice.vdbs (2 documents)
2024-05-16T08:37:30.627+0000 writing deployservice.tasks to /data/backup/mongodump-2024-5-16/deployservice/tasks.bson
2024-05-16T08:37:30.648+0000 done dumping deployservice.settings (1 document)
2024-05-16T08:37:30.648+0000 writing deployservice.sessions to /data/backup/mongodump-2024-5-16/deployservice/sessions.bson
2024-05-16T08:37:30.649+0000 done dumping deployservice.tasks (0 documents)
2024-05-16T08:37:30.649+0000 writing deployservice.rules to /data/backup/mongodump-2024-5-16/deployservice/rules.bson
2024-05-16T08:37:30.666+0000 done dumping deployservice.sessions (0 documents)
2024-05-16T08:37:30.667+0000 done dumping deployservice.rules (0 documents)
2024-05-16T08:37:30.701+0000 done dumping deployservice.logs (10812 documents)
2024-05-16T08:37:30.792+0000 done dumping deployservice.deploys (1193 documents)
root@c02e337bf417:/# cd /data/backup/mongodump-2024-5-16/
root@c02e337bf417:/data/backup/mongodump-2024-5-16# ls
deployservice
root@c02e337bf417:/data/backup/mongodump-2024-5-16# ls deployservice/
backups.bson migrations.bson services.bson tasks.bson
backups.metadata.json migrations.metadata.json services.metadata.json tasks.metadata.json
deploys.bson records.bson sessioninfos.bson users.bson
deploys.metadata.json records.metadata.json sessioninfos.metadata.json users.metadata.json
logs.bson rules.bson sessions.bson vdbs.bson
logs.metadata.json rules.metadata.json sessions.metadata.json vdbs.metadata.json
loopholes.bson servers.bson settings.bson vulnerabilities.bson
loopholes.metadata.json servers.metadata.json settings.metadata.json vulnerabilities.metadata.json
# 也可以导出特定表,例如导出数据库的 users 表 到指定目录
mongodump -h 127.0.0.1:27017 -u=账号 -p=密码 --authenticationDatabase=admin -c users -d deployservice -o /data/backup/users
root@c02e337bf417:/data/backup# ls
mongodump-2024-5-16
root@c02e337bf417:/data/backup# mongodump -h 127.0.0.1:27017 -u=admin -p=123456 --authenticationDatabase=admin -c users -d deployservice -o /data/backup/users
2024-05-16T08:43:10.217+0000 writing deployservice.users to /data/backup/users/deployservice/users.bson
2024-05-16T08:43:10.218+0000 done dumping deployservice.users (8 documents)
root@c02e337bf417:/data/backup# ls
mongodump-2024-5-16 users
查看备份数据 #
以上备份的数据都是二进制的,是直接查看不到的,可以通过工具 bsondump(安装 MongoDB 自带了) 来进行查看,例如
root@c02e337bf417:/data/backup/mongodump-2024-5-16/deployservice# ls
backups.bson migrations.bson services.bson tasks.bson
backups.metadata.json migrations.metadata.json services.metadata.json tasks.metadata.json
deploys.bson records.bson sessioninfos.bson users.bson
deploys.metadata.json records.metadata.json sessioninfos.metadata.json users.metadata.json
logs.bson rules.bson sessions.bson vdbs.bson
logs.metadata.json rules.metadata.json sessions.metadata.json vdbs.metadata.json
loopholes.bson servers.bson settings.bson vulnerabilities.bson
loopholes.metadata.json servers.metadata.json settings.metadata.json vulnerabilities.metadata.json
root@c02e337bf417:/data/backup/mongodump-2024-5-16/deployservice# bsondump migrations.bson
{"_id":{"$oid":"5ffd4a425c6af8aa4f3e64f4"},"name":"20200909_update_service_schema","__v":{"$numberInt":"0"},"createAt":{"$date":{"$numberLong":"1610435138557"}},"status":"done","updateAt":{"$date":{"$numberLong":"1715409734303"}},"duration":{"$numberInt":"14"},"message":null}
{"_id":{"$oid":"63199c816e25985082415721"},"name":"20220908_update_server_password","__v":{"$numberInt":"0"},"createAt":{"$date":{"$numberLong":"1662622848971"}},"status":"done","updateAt":{"$date":{"$numberLong":"1715409734352"}},"duration":{"$numberInt":"99"},"message":null}
{"_id":{"$oid":"6458d945370b214d125ed703"},"name":"202303017_update_server_password","__v":{"$numberInt":"0"},"createAt":{"$date":{"$numberLong":"1683544389220"}},"status":"done","updateAt":{"$date":{"$numberLong":"1715409734356"}},"duration":{"$numberInt":"59"},"message":null}
{"_id":{"$oid":"65ae38706ce52db7b5ae8918"},"name":"202401017_init_vulnerability_database","__v":{"$numberInt":"0"},"createAt":{"$date":{"$numberLong":"1705916528598"}},"status":"done","updateAt":{"$date":{"$numberLong":"1709546970264"}},"duration":{"$numberInt":"17"},"message":null}
2024-05-16T08:46:55.806+0000 4 objects found
2. cp 或者rsync #
可以直接复制数据文件,但是必须在复制文件前停止对 MongoDB 的操作,否则复制的文件是无效的。
二、单节点意外关闭后恢复数据 #
有时mongodb异常退出后会造成服务无法启动,比如服务器异常断电场景
数据修复流程: #
-
先备份现有的数据 可以用 cp 命令将现有的数据的整个目录的所有文件都备份一份。
-
使用 mongod –repair
#针对 所有数据库
mongod --repair
#针对 单个数据库
mongod --dbpath /data/mongodb/data/djx --repair
一般情况下,不应该手动删除该mongod.lock文件。而是使用上述过程来恢复数据库。在严峻的情况下,您可以删除文件,使用可能损坏的文件启动数据库,并尝试从数据库中恢复数据,但这存在风险。
docker容器-数据修复流程: #
docker-compose 以交互式方式运行容器
模板添加 :container_name: mymongo(自定义容器名)
例如
services:
redis:
image: ${REGISTRY}/docker/redis:${REDIS_TAG}
restart: always
volumes:
- ./redis/data:/data
networks:
- deploy_net
mongo:
image: ${REGISTRY}/docker/mongo:${MONGO_TAG}
container_name: mymongo
command: --wiredTigerCacheSizeGB=${MONGO_CACHE_GB}
执行命令如下
docker-compose run your_service sh #以交互式方式启动容器
mongod --dbpath=data/db(mongo db的路径) --repair #这里的/data/db是容器里面的db路径
例如:
docker-compose run mymongo sh # 启动容器
mongod --dbpath=data/db --repair # 修复
三、MongoDB 数据恢复 #
1、mongorestore特点 #
- mongorestore 可以创建新的数据库或将数据添加到现有的数据库,但是 mongorestore 仅仅执行insert 操作,不执行 update操作。这就意味着如果将文档还原到现有的数据库,现有的数据库中的文档的_id的值和要还原的文档中的_id 值是一样的,是不会将数据库原有的值覆盖的。
- 重建索引,mongorestore 会重建索引。
- mongorestore 不恢复 system.profile 的数据
2、mongorestore 常用参数 #
--help # 查看帮助
--quiet # 通过抑制 MongoDB的复制,连接等活动,来实现数据恢复。
--host <hostname><:port>, -h <hostname><:port> # 指定恢复的主机ip和端口号,默认值localhost:27017
--port # 指定端口号 默认27017
--username <username>, -u <username> # 指定用户名
--password <password>, -p <password> # 指定密码
--authenticationDatabase <dbname> # 指定认证的数据库
--authenticationMechanism <name> # 指定认证的算法 ,默认值 SCRAM-SHA-1
--objcheck # 开启验证,验证还原操作,确保没有无效的文档插入数据库。会有较小的性能影响
--oplogReplay # 恢复备份数据并将 mongodump 执行期间的操作(记录在导出的日志)恢复。
--oplogLimit # 指定恢复
--oplogFile # 指定 Oplog 路径
--keepIndexVersion # 阻止mongorestore在还原过程中将索引升级到最新版本。
--restoreDbUsersAndRoles # 还原指定的数据库用户和角色。
--maintainInsertionOrder # 默认值为False,如果为 True,mongorestore 将按照输入源的文档顺序插入,否则是 随机执行插入。
--numParallelCollections int, -j int # 指定并行恢复的集合数。
--numInsertionWorkersPerCollection int # 默认值为 1,指定每个集合恢复的并发数,大数据量导入增加该值可提高 恢复速度。
--gzip # 从压缩文档中 恢复。
--archive # 从归档文件中恢复。
--dir # 指定还原数据储存目录。
3、mongorestore 恢复示例 #
语法:mongorestore -h host:port -d dbname –dir dbdirectory
-h:数据库服务器地址+服务端口
-d:恢复数据库后的数据库名称
-c:需要恢复的数据表
–dir:备份数据库所在的位置
如果数据库开启了登录认证,则需要添加用户认证信息
# 恢复 deployservice数据库的所有表
mongorestore -h 127.0.0.1:27017 -u=账号 -p=密码 --authenticationDatabase=admin -d deployservice /data/backup/mongodump-2024-5-16
# 恢复 deployservice数据库中特定的表,比如只恢复users 表
mongorestore -h 127.0.0.1:27017 -u=账号 -p=密码 --authenticationDatabase=admin -d deployservice /data/backup/mongodump-2024-5-16 /deployservice/users.bson
PostgreSQL数据备份与恢复 #
PostgreSQL备份方案 #
- 方案一:逻辑备份——使用pg_dump
- 方案二:物理备份——使用pg_rman(暂不介绍)
PostgreSQL逻辑备份恢复 #
逻辑备份:pg_dump #
1、pg_dump简介 #
pg_dump 是 PostgreSQL 自带的备份工具,可以将 PostgreSQL 数据库备份为一个 SQL 脚本,可以用来还原数据库。
pg_dump 通常会随着 PostgreSQL 安装包一起提供。如果你已经安装了 PostgreSQL,则 pg_dump 应该已经在系统中可用。如果你使用的是 Linux 系统,你可以通过以下命令来查找 pg_dump 的位置:which pg_dump
- pg_dump 支持备份表,备份用户,备份数据库
- pg_dumpall 支持导出全库的数据
- pg_dump 可以把数据备份成SQL文本的形式,也可以自定义为tar包等二进制
2、备份数据操作 #
常用备份命令(查看帮助信息) pg_dump --help
备份操作实例
# 备份准备
mkdir -p /pgbak
chown postgres.postgres /pgbak
# 本机备份
# 方式一:使用重定向符号
bash-5.0# pg_dump -U demo testdb > /pgbak/testdb.sql
bash-5.0# cd pgbak/
bash-5.0# ls
testdb.sql
bash-5.0#
# 方式二:使用pg参数
bash-5.0# pg_dump -U demo testdb --file=/pgbak/backup-testdb11.sql
bash-5.0# ls
testdb.sql backup-testdb11.sql
# 压缩备份
若遇到数据库容量比较大时,可以选择压缩备份
ash-5.0# pg_dump -U demo testdb --format=custom --file=/pgbak/db_testdb000.dump
bash-5.0# ls
db_testdb000.dump testdb.sql backup-testdb11.sql
2.2 恢复 #
恢复方式 #
- psql恢复:一般恢复SQL文本
- pg_restore恢复:一般恢复压缩的二进制文件
恢复实现 #
# 基于sql文件恢复
pgsql --dbname=db_name --file=backup_db_name.sql
# 基于dump压缩文件恢复
pg_restore --dbname=db_name backup_db_name.dump