达梦数据库备份与恢复
1.切换dmdba用户
su - dmdba
2.查看归档状态
2.1 连接数据库
disql SYSDBA/'"DaMeng@123"'@localhost:5237
2.2 检查归档状态
SELECT arch_mode FROM V$DATABASE;
2.3 若未启用(显示N),执行
ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/home/dmdba/dmarch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=20480';
ALTER DATABASE OPEN;
2.4 创建备份目录
mkdir -p /home/dmdba/backup
chown -R dmdba:dinstall /home/dmdba/backup
3.创建测试数据
-- 创建测试表
CREATE TABLE TEST_BACKUP (
ID INT PRIMARY KEY,
NAME VARCHAR(50),
CREATED_TIME TIMESTAMP DEFAULT SYSTIMESTAMP
);
-- 插入测试数据
INSERT INTO TEST_BACKUP(ID, NAME) VALUES (1, '逻辑备份测试数据1');
INSERT INTO TEST_BACKUP(ID, NAME) VALUES (2, '达梦数据库备份测试');
COMMIT;
- 添加更多测试数据(一次性插入多条记录)
-- 插入10条测试数据
INSERT INTO TEST_BACKUP (ID, NAME)
VALUES
(3, '备份测试数据3'),
(4, '达梦数据库学习笔记'),
(5, '运维工程师专用数据'),
(6, '逻辑备份验证数据'),
(7, '数据库恢复测试'),
(8, '达梦8.0新特性测试'),
(9, '自动备份脚本验证'),
(10, '云环境部署记录'),
(11, '高可用架构数据'),
(12, '容灾恢复验证数据');
COMMIT;
-- 验证数据
SELECT * FROM TEST_BACKUP;
- 增加测试数据多样性(不同时间、不同数据类型)
-- 创建新表存储不同类型的数据
CREATE TABLE TEST_DATA_TYPES (
id INT PRIMARY KEY,
name VARCHAR(100),
price DECIMAL(10,2),
create_date DATE,
active CHAR(1),
description TEXT
);
-- 插入多种数据类型的数据
INSERT INTO TEST_DATA_TYPES
(id, name, price, create_date, active, description)
VALUES
(1, '标准商品', 199.99, DATE '2023-01-15', 'Y', '普通商品描述信息'),
(2, '限时特惠', 99.50, SYSDATE, 'Y', '促销活动的商品'),
(3, '已下架商品', 299.00, DATE '2022-11-20', 'N', '已停止销售的商品'),
(4, '会员专享', 399.00, ADD_DAYS(SYSDATE, -30), 'Y', '仅限会员购买'),
(5, '测试商品', 0.01, SYSDATE, 'Y', '用于系统测试的特殊商品');
COMMIT;
-- 验证数据
SELECT * FROM TEST_DATA_TYPES;
- 验证数据完整性查询
-- 数据量统计
SELECT 'TEST_BACKUP表' AS "表名", COUNT(*) AS "记录数" FROM TEST_BACKUP
UNION ALL
SELECT 'TEST_DATA_TYPES表', COUNT(*) FROM TEST_DATA_TYPES;
- 逻辑备份前检查数据状态
SELECT
(SELECT COUNT(*) FROM TEST_BACKUP) AS "测试表数据量",
(SELECT COUNT(*) FROM TEST_DATA_TYPES) AS "类型表数据量",
(SELECT MAX(id) FROM TEST_BACKUP) AS "最大ID",
(SELECT MAX(create_date) FROM TEST_DATA_TYPES) AS "最新日期"
FROM DUAL;
- 查看当前用户下的所有表
SELECT table_name AS "表名", tablespace_name AS "表空间", num_rows AS "行数"
FROM DBA_TABLES
WHERE owner = 'SYSDBA'
ORDER BY table_name;
- 查看用户创建的业务表
SELECT owner AS "用户", table_name AS "业务表名"
FROM DBA_TABLES
WHERE owner NOT IN ('SYS', 'SYSAUDITOR', 'SYSSSO')
AND table_name NOT LIKE 'SYS%'
ORDER BY owner, table_name;
4.备份类型对比

5.数据异常恢复类型
6.逻辑备份与还原
- 导出:dexp(逻辑备份)
导入:dimp(逻辑还原)
6.1 进入达梦用户
su - dmdba
cd /home/dmdba/dmdbms/bin
6.2 删除数据,模拟数据丢失,进行恢复
-- 查看TEST_BACKUP表原始数据(记录ID分布)
SELECT id, name, created_time FROM TEST_BACKUP ORDER BY id;
-- 删除部分数据(删除ID大于5的记录)
DELETE FROM TEST_BACKUP WHERE id > 1;
-- 确认删除结果(应只剩下前5条记录)
SELECT * FROM TEST_BACKUP;
6.3 备份方式
(1)标准化逻辑备份还原命令集
- 备份内容

-
达梦数据库全库还原行为详解
# 还原全库是核心原理
如果目标数据库中的表已经存在但数据丢失:默认情况下不会还原该表的数据
表结构存在但数据不同:不会自动覆盖或还原数据
表完全不存在:会重新创建表结构并导入数据
# 默认行为(未指定参数)
dimp ... FULL=Y
表存在但数据丢失:跳过该表的数据导入
表结构存在但数据不同:保留现有数据,不还原备份数据
表不存在:创建表结构并导入数据
# 强制还原数据的正确方式
方法1:清空表后还原(推荐)
dimp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/full_backup_20250620.dmp \
FULL=Y \
TABLE_EXISTS_ACTION=TRUNCATE
作用:先清空所有已存在表的数据,然后重新导入备份数据
方法2:删除后重建(谨慎使用)
dimp ... FULL=Y TABLE_EXISTS_ACTION=REPLACE
作用:删除已存在的表,然后重新创建并导入数据(会删除现有表的约束、索引等)
方法3:追加数据(不推荐)
dimp ... FULL=Y TABLE_EXISTS_ACTION=APPEND
作用:保留现有数据,将备份数据追加到表中(可能导致重复数据)
- 全库备份还原
# 全库备份
./dexp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/full_backup_$(date +%Y%m%d).dmp \
LOG=/home/dmdba/backup/full_backup_$(date +%Y%m%d).log \
FULL=Y
# 全库还原
./dimp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/full_backup_20250620.dmp \
LOG=/home/dmdba/backup/full_restore_$(date +%Y%m%d).log \
FULL=Y
(2)用户级备份与还原
- 备份内容

- 查看用户名,用来备份还原是OWNER=SYSDBA参数配置
-- 查看所有用户
SELECT USERNAME AS "用户名", ACCOUNT_STATUS AS "状态"
FROM DBA_USERS
WHERE USERNAME NOT IN ('SYS', 'SYSAUDITOR', 'SYSSSO', 'CTISYS');
-- 查看有对象的用户
SELECT DISTINCT OWNER AS "用户名"
FROM DBA_OBJECTS
WHERE OWNER NOT IN ('SYS', 'SYSAUDITOR', 'SYSSSO', 'CTISYS');
- 用户备份与还原
# 用户备份
./dexp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/user_USERNAME_$(date +%Y%m%d).dmp \
LOG=/home/dmdba/backup/user_USERNAME_$(date +%Y%m%d).log \
OWNER=SYSDBA
# 用户还原
./dimp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/user_USERNAME_20240620.dmp \
LOG=/home/dmdba/backup/user_USERNAME_restore_$(date +%Y%m%d).log \
OWNER=SYSDBA
(3)模式级备份与还原
- 备份内容

- 查看模式,备份还原SCHEMAS=SYSDBA需要配置
-- 查询当前会话的默认模式
SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') AS "当前模式";
-- 查看具体表所在的模式
SELECT OWNER AS "模式名", TABLE_NAME AS "表名"
FROM DBA_TABLES
WHERE TABLE_NAME IN ('TEST_BACKUP', 'TEST_DATA_TYPES');
- 模式备份还原
# 模式备份
./dexp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/schema_SCHEMA_$(date +%Y%m%d).dmp \
LOG=/home/dmdba/backup/schema_SCHEMA_$(date +%Y%m%d).log \
SCHEMAS=SYSDBA
# 模式还原
./dimp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/schema_SCHEMA_20240620.dmp \
LOG=/home/dmdba/backup/schema_SCHEMA_restore_$(date +%Y%m%d).log \
SCHEMAS=SYSDBA
(4)表级备份与还原(最常用)
- 备份内容

- 查看模式名,备份和还原TABLES=SYSDBA.TEST_BACKUP需要指定
1. 快速查询单表模式名
-- 查询TEST_BACKUP表所属模式
SELECT OWNER AS "模式名"
FROM DBA_TABLES
WHERE TABLE_NAME = 'TEST_BACKUP';
2.查看模式对应完整表名
-- 查询所有业务表
SELECT owner || '.' || table_name AS "完整表名"
FROM dba_tables
WHERE owner NOT IN ('SYS', 'SYSAUDITOR', 'SYSSSO')
AND table_name NOT LIKE 'SYS%';
- 表级备份还原
# 单表备份
./dexp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/table_SYSDBA_TEST_BACKUP_$(date +%Y%m%d).dmp \
LOG=/home/dmdba/backup/table_SYSDBA_TEST_BACKUP_$(date +%Y%m%d).log \
TABLES=SYSDBA.TEST_BACKUP
# 多表备份(逗号分隔)
./dexp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/two_tables_$(date +%Y%m%d).dmp \
LOG=/home/dmdba/backup/two_tables_$(date +%Y%m%d).log \
TABLES="SYSDBA.TEST_BACKUP,SYSDBA.TEST_DATA_TYPES"
# 表还原(覆盖)
./dimp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/table_SYSDBA_TEST_BACKUP_20250620.dmp \
LOG=/home/dmdba/backup/table_restore_$(date +%Y%m%d).log \
TABLES=SYSDBA.TEST_BACKUP \
TABLE_EXISTS_ACTION=TRUNCATE
# 表还原(追加)
./dimp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/table_SYSDBA_TEST_DATA_TYPES_20250620.dmp \
LOG=/home/dmdba/backup/table_restore_$(date +%Y%m%d).log \
TABLES=SYSDBA.TEST_DATA_TYPES \
TABLE_EXISTS_ACTION=APPEND
6.4 使用说明
- 通用参数:
USERID='SYSDBA/"DaMeng@123"@localhost:5237':认证字符串
FILE:备份文件路径,包含日期变量
LOG:日志文件路径,包含日期变量
/home/dmdba/backup/:统一存储目录
- 操作类型:
备份使用dexp工具
还原使用dimp工具
- 关键参数:
FULL=Y:全库操作
OWNER=USERNAME:用户级操作
SCHEMAS=SYSDBA_NAME:模式级操作
TABLES=SYSDBA.TABLE:表级操作
TABLE_EXISTS_ACTION=TRUNCATE/APPEND:表还原策略
日期格式:
$(date +%Y%m%d):生成YYYYMMDD格式日期
示例:20250620
- 占位符替换:
USERNAME → 实际用户名
SCHEMA_NAME → 实际模式名
SCHEMA.TABLE → 实际模式.表名
6.5 特定情况下,可以为了恢复,删除指定表
-- 检查表是否存在
SELECT * FROM USER_TABLES WHERE TABLE_NAME = 'TEST_BACKUP';
-- 安全删除(如果表存在则删除)
DROP TABLE IF EXISTS SYSDBA.TEST_BACKUP;
7. 参考文档
https://blog.csdn.net/qq_41222972/article/details/148308476


浙公网安备 33010602011771号