备份与恢复 #

一、备份概述 #

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