备份与恢复 #
一、备份概述 #
1.1 备份类型 #
| 类型 | 说明 | 特点 |
|---|---|---|
| 全量备份 | 备份整个数据库 | 完整但耗时 |
| 增量备份 | 只备份变化部分 | 快速但需全量基础 |
| 在线备份 | 运行时备份 | 不影响服务 |
| 离线备份 | 停机备份 | 数据一致性好 |
1.2 备份策略 #
text
备份策略建议:
├── 定期全量备份(如每周)
├── 频繁增量备份(如每天)
├── 异地备份存储
├── 备份验证测试
└── 保留多个版本
二、SQL备份命令 #
2.1 全量备份 #
sql
BACKUP DATABASE /backup/mydb_backup.zip
2.2 指定压缩级别 #
sql
BACKUP DATABASE /backup/mydb_backup.zip COMPRESSION_LEVEL 9
2.3 增量备份 #
sql
BACKUP DATABASE /backup/mydb_incremental.zip LEVEL 1
2.4 备份返回结果 #
sql
BACKUP DATABASE /backup/mydb_backup.zip RETURN count
三、控制台备份工具 #
3.1 使用backup.sh #
bash
$ORIENTDB_HOME/bin/backup.sh plocal:/data/databases/mydb /backup/mydb.zip
3.2 远程备份 #
bash
$ORIENTDB_HOME/bin/backup.sh remote:localhost/mydb /backup/mydb.zip root root
3.3 增量备份 #
bash
$ORIENTDB_HOME/bin/backup.sh plocal:/data/databases/mydb /backup/mydb_incr.zip 1
3.4 备份参数 #
text
参数说明:
├── 数据库路径 - plocal:或remote:
├── 备份文件 - 输出文件路径
├── 压缩级别 - 0-9,默认9
├── 增量级别 - 0全量,1增量
└── 用户凭证 - 用户名和密码
四、SQL恢复命令 #
4.1 从备份恢复 #
sql
RESTORE DATABASE /backup/mydb_backup.zip
4.2 恢复到新数据库 #
sql
CREATE DATABASE plocal:/data/databases/mydb_restored root root plocal
RESTORE DATABASE /backup/mydb_backup.zip
4.3 恢复验证 #
sql
RESTORE DATABASE /backup/mydb_backup.zip VERIFY
五、控制台恢复工具 #
5.1 使用restore.sh #
bash
$ORIENTDB_HOME/bin/restore.sh plocal:/data/databases/mydb_restored /backup/mydb.zip
5.2 远程恢复 #
bash
$ORIENTDB_HOME/bin/restore.sh remote:localhost/mydb /backup/mydb.zip root root
六、导出导入 #
6.1 导出数据库 #
sql
EXPORT DATABASE /backup/mydb.export.gz
6.2 导出选项 #
sql
EXPORT DATABASE /backup/mydb.export.gz
-excludeAll=false
-includeClasses=Person,Company
-excludeClasses=Log
6.3 导入数据库 #
sql
IMPORT DATABASE /backup/mydb.export.gz
6.4 导入选项 #
sql
IMPORT DATABASE /backup/mydb.export.gz
-preserveClusterIDs=true
-merge=true
6.5 导出导入 vs 备份恢复 #
| 操作 | 导出导入 | 备份恢复 |
|---|---|---|
| 格式 | JSON/文本 | 二进制 |
| 跨版本 | 支持 | 可能不兼容 |
| 大小 | 较大 | 较小 |
| 速度 | 较慢 | 较快 |
| 可读性 | 可读 | 不可读 |
七、自动备份脚本 #
7.1 Shell脚本 #
bash
#!/bin/bash
ORIENTDB_HOME=/opt/orientdb
BACKUP_DIR=/backup/orientdb
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME=mydb
DB_PATH=plocal:/data/databases/$DB_NAME
mkdir -p $BACKUP_DIR
echo "Starting backup at $(date)"
$ORIENTDB_HOME/bin/backup.sh $DB_PATH $BACKUP_DIR/${DB_NAME}_${DATE}.zip
if [ $? -eq 0 ]; then
echo "Backup completed successfully"
find $BACKUP_DIR -name "${DB_NAME}_*.zip" -mtime +7 -delete
echo "Old backups cleaned up"
else
echo "Backup failed"
exit 1
fi
7.2 定时任务 #
bash
crontab -e
0 2 * * * /opt/scripts/backup_orientdb.sh >> /var/log/orientdb_backup.log 2>&1
7.3 Python备份脚本 #
python
import subprocess
import datetime
import os
import shutil
def backup_database(db_path, backup_dir, db_name):
timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
backup_file = os.path.join(backup_dir, f'{db_name}_{timestamp}.zip')
cmd = [
'/opt/orientdb/bin/backup.sh',
db_path,
backup_file
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
print(f'Backup completed: {backup_file}')
cleanup_old_backups(backup_dir, db_name, days=7)
return backup_file
else:
print(f'Backup failed: {result.stderr}')
return None
def cleanup_old_backups(backup_dir, db_name, days=7):
cutoff = datetime.datetime.now() - datetime.timedelta(days=days)
for file in os.listdir(backup_dir):
if file.startswith(db_name) and file.endswith('.zip'):
file_path = os.path.join(backup_dir, file)
file_time = datetime.datetime.fromtimestamp(os.path.getmtime(file_path))
if file_time < cutoff:
os.remove(file_path)
print(f'Deleted old backup: {file}')
if __name__ == '__main__':
backup_database(
'plocal:/data/databases/mydb',
'/backup/orientdb',
'mydb'
)
八、备份验证 #
8.1 验证备份完整性 #
bash
unzip -t /backup/mydb_backup.zip
8.2 测试恢复 #
bash
$ORIENTDB_HOME/bin/restore.sh plocal:/data/databases/mydb_test /backup/mydb_backup.zip
$ORIENTDB_HOME/bin/console.sh "CONNECT plocal:/data/databases/mydb_test root root; SELECT COUNT(*) FROM Person"
8.3 数据校验 #
sql
SELECT COUNT(*) FROM Person
SELECT SUM(@size) FROM cluster:*
九、云备份 #
9.1 AWS S3备份 #
bash
aws s3 cp /backup/mydb_backup.zip s3://my-bucket/orientdb-backups/
9.2 自动上传脚本 #
bash
#!/bin/bash
BACKUP_FILE=$1
S3_BUCKET=my-bucket/orientdb-backups
aws s3 cp $BACKUP_FILE s3://$S3_BUCKET/
if [ $? -eq 0 ]; then
echo "Upload to S3 completed"
else
echo "Upload failed"
exit 1
fi
十、灾难恢复 #
10.1 恢复流程 #
text
灾难恢复流程:
├── 1. 评估损坏程度
├── 2. 停止数据库服务
├── 3. 准备恢复环境
├── 4. 执行恢复操作
├── 5. 验证数据完整性
├── 6. 重启服务
└── 7. 监控系统状态
10.2 恢复步骤 #
bash
# 停止服务
systemctl stop orientdb
# 恢复数据库
$ORIENTDB_HOME/bin/restore.sh plocal:/data/databases/mydb /backup/mydb_backup.zip
# 验证数据
$ORIENTDB_HOME/bin/console.sh "CONNECT plocal:/data/databases/mydb root root; SELECT COUNT(*) FROM Person"
# 启动服务
systemctl start orientdb
10.3 部分恢复 #
sql
CREATE DATABASE plocal:/data/databases/mydb_partial root root plocal
IMPORT DATABASE /backup/mydb.export.gz -includeClasses=Person,Company
十一、备份监控 #
11.1 备份状态检查 #
bash
#!/bin/bash
BACKUP_DIR=/backup/orientdb
ALERT_EMAIL=admin@example.com
LATEST_BACKUP=$(ls -t $BACKUP_DIR/*.zip | head -1)
BACKUP_AGE=$((($(date +%s) - $(stat -c %Y $LATEST_BACKUP)) / 3600))
if [ $BACKUP_AGE -gt 24 ]; then
echo "Warning: Latest backup is $BACKUP_AGE hours old" | mail -s "Backup Alert" $ALERT_EMAIL
fi
11.2 备份日志 #
bash
#!/bin/bash
LOG_FILE=/var/log/orientdb_backup.log
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}
log "Backup started"
log "Backup completed: $BACKUP_FILE"
log "Backup size: $(du -h $BACKUP_FILE | cut -f1)"
十二、最佳实践 #
12.1 备份策略 #
text
推荐备份策略:
├── 每日增量备份
├── 每周全量备份
├── 保留4周备份
├── 异地存储备份
└── 定期恢复测试
12.2 安全建议 #
text
备份安全建议:
├── 加密备份文件
├── 限制备份访问权限
├── 使用安全传输
├── 验证备份完整性
└── 记录备份日志
十三、总结 #
备份与恢复要点:
| 操作 | 命令 | 说明 |
|---|---|---|
| 全量备份 | BACKUP DATABASE | 备份整个数据库 |
| 增量备份 | BACKUP DATABASE LEVEL 1 | 备份变化部分 |
| 恢复 | RESTORE DATABASE | 从备份恢复 |
| 导出 | EXPORT DATABASE | 导出为JSON |
| 导入 | IMPORT DATABASE | 导入JSON数据 |
下一步,让我们学习性能优化!
最后更新:2026-03-27