达梦数据库备份与恢复

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

 

 

posted @ 2025-06-20 16:04  Leonardo-li  阅读(1508)  评论(0)    收藏  举报