目前官方 MongoDB 社区版是不支持 Hot Backup 热备份的, 我们只能通过 mongodump 等逻辑备份工具导出 bson 文件, 再 mongorestore 导入, 类似 MySQL 的 mysqldump 工具.
前言
目前官方 MongoDB 社区版是不支持 Hot Backup 热备份的, 我们只能通过 mongodump 等逻辑备份工具导出 bson 文件, 再 mongorestore 导入, 类似 MySQL 的 mysqldump 工具.
在备份副本集时, 我们需指定 --oplog 选项记录备份间产生的增量数据, 类似 mysqldump --single-transaction --master-data=2(做一致性快照并记录当前的 binlog 点).
对副本集的成员恢复, 需先切成单机版, mongorestore 必须指定 --oplogReplay 选项, 以恢复到某一时刻的快照, 最后还需填充 oplog(增量数据以哪个位置点开始断点续传),mongorestore -d local -c oplog.rs dump/oplog.bson, 最后一步再切为副本集成员重新启动.
中小型数据库备份起来简单快捷, 如果过 TB 级的数据量, 那将是痛苦的.
如果你的 oplog 设置过小, 很有可能在备份恢复这段时间, oplog 被覆盖重写, 那么你将永远无法加入副本集集群里.
概述
Percona MongoDB 3.2 版本默认开始支持 WiredTiger 引擎的在线热备份, 解决了官方版只能通过 mongodump 逻辑备份这一缺陷.
参考文献:
https://www.percona.com/doc/percona-server-for-mongodb/LATEST/hot-backup.html#hot-backup
注意事项
1, 要在当前 dbpath 中对数据库进行热备份, 请在 admin 数据库上以管理员身份运行 createBackup 命令, 并指定备份目录.
2, 可以替换一台从库为 Percona MongoDB, 做备份使用.(我这里实测是 Percona MongoDB 3.4 版本)
原理
Percona MongoDB HotBackup 热备份原理:
你可以想象成 xtrabackup 工具
备份:
首先会启动一个后台检测的进程, 实时检测 MongoDB Oplog 的变化, 一旦发现 oplog 有新的日志写入, 立刻将日志写入到日志文件 WiredTiger.backup 中(你可以 strings WiredTiger.backup 查看 oplog 操作日志的变化);
复制 MongoDB dbpath 的数据文件和索引文件到指定的备份目录里;
......
恢复:
将 WiredTiger.backup 日志进行回放, 将操作日志变更应用到 WiredTiger 引擎里, 最终得到一致性快照恢复;
把备份目录里的数据文件直接拷贝到你的 dbpath 下, 然后启动 MongoDB 即可, 会自动接入副本集集群.
运行
这里我封装了一个 PHP 脚本, 直接在 SHELL 里运行即可.
1, 环境准备:
shell> yum install -y PHP-Pear PHP-devel PHP gcc openssl openssl-devel cyrus-sasl cyrus-sasl-devel
2,PHP-mongo 驱动安装:
shell> pecl install mongo
把 extension=mongo.so 加入到 / etc/PHP.INI 最后一行.
3, 创建 MongoDB 超级用户权限(备份时使用)
db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]})
4, 修改 pmongo_bak.PHP 配置信息
- //************* 修改下面的配置信息 ***************//
- $user = "admin"; // 使用 root 用户权限
- $pwd = '123456';
- $host = '192.168.180.26'; // 在从库上热备
- $port = '27017';
- $authdb = 'admin'; // 权限认证数据库
- $BAKDIR = "/data/bak/";
- $BAKDIR .= date('Y_m_d_H_i_s');
- //************* 下面的代码不用修改 ***************//
- $m = new MongoBak($user,$pwd,$host,$port,$authdb,$BAKDIR);
- ......
5, 前台运行:
shell> PHP pmongo_bak.PHP(以 root 权限运行)
6, 写入系统 crontab 里
00 01 * * * /usr/bin/PHP /root/php_mongodb/pmongo_bak.PHP > /root/php_mongodb/bak_status.log 2 >&1
7, 不支持远程备份, 需将备份脚本部署在从库里. 如果你想把数据备份到远程, 可以采用 NFS 等文件系统 mount 挂载上.
来源: http://database.51cto.com/art/201812/588660.htm