1.备份
- shell备份脚本dm_bak.sh
- 参数解释:COMPRESS=Y #启用压缩 BUFFER=10240 #缓冲区大小 PARALLEL=4 #备份启用线程
#!/bin/bash
# 全库备份排除指定表脚本(增强日志版)
BAK_DIR="/home/dmdba/backup"
DATE=$(date +%Y%m%d)
TIMESTAMP=$(date +%Y-%m-%d_%H:%M:%S)
# 设置需要排除的表名(空格分隔)
EXCLUDE_TABLES=("UNUSED_TABLE1" "TEMP_LOG_TABLE2" "ARCHIVE_DATA_TABLE3")
# 日志函数:带时间戳输出
log() {
local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "[${timestamp}] $1"
echo "[${timestamp}] $1" >> "${BAK_DIR}/script_log_${DATE}.log"
}
# 开始备份
log "========== 备份任务启动 =========="
log "备份目录: ${BAK_DIR}"
log "排除表: ${EXCLUDE_TABLES[@]}"
log "生成SQL查询语句..."
# 生成SQL查询语句
SQL_QUERY="SELECT OWNER || '.' || TABLE_NAME
FROM DBA_TABLES
WHERE OWNER NOT IN ('SYS', 'SYSAUDITOR', 'SYSSSO')
AND TABLE_NAME NOT IN ("
# 添加排除表
for table in "${EXCLUDE_TABLES[@]}"; do
SQL_QUERY+="'$table',"
done
SQL_QUERY=${SQL_QUERY%,*}")"; # 移除最后一个逗号
log "查询语句: ${SQL_QUERY}"
log "连接数据库获取表列表..."
# 获取表列表
TABLE_LIST=$(/home/dmdba/dmdbms/bin/disql -s SYSDBA/\"DaMeng@123\"@localhost:5237 "$SQL_QUERY" | awk 'BEGIN{FS=" "} NR>2 && /\./ {print $1}' | tr '\n' ',' | sed 's/,$//')
log "获取到表列表: ${TABLE_LIST}"
log "开始执行备份..."
# 执行备份
/home/dmdba/dmdbms/bin/dexp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=${BAK_DIR}/full_excluded_${DATE}.dmp \
TABLES="$TABLE_LIST" \
LOG=${BAK_DIR}/full_excluded_${DATE}.log \
COMPRESS=Y \
BUFFER=10240 \
PARALLEL=4
# 检查备份结果
if [ $? -eq 0 ]; then
BACKUP_SIZE=$(du -h ${BAK_DIR}/full_excluded_${DATE}.dmp | awk '{print $1}')
log "备份成功完成! 备份文件大小: ${BACKUP_SIZE}"
log "排除表: ${EXCLUDE_TABLES[@]}"
log "备份日志: ${BAK_DIR}/full_excluded_${DATE}.log"
else
log "备份失败! 错误代码: $?"
log "请检查日志文件: ${BAK_DIR}/full_excluded_${DATE}.log"
fi
log "========== 备份任务结束 =========="
2.还原
- 达梦数据库的dimp工具中,TABLE_EXISTS_ACTION参数用于指定当要导入的表已经存在时的处理方式,请按照自己需要替换参数
- 如果表结构未改变,使用TRUNCATE,也是常用和比较安全的方式,因为不会改变原表的索引和约束,且恢复快(推荐使用);
- 如果表结构有改变,使用REPLACE,最彻底的恢复,完全恢复到备份时的状态

2.1 恢复整个备份包
./dimp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/backup/full_excluded_20250620.dmp
2.2 恢复指定表(覆盖方式)
./dimp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/backup/full_excluded_20250620.dmp \
TABLES=SYSDBA.TEST_BACKUP \
TABLE_EXISTS_ACTION=TRUNCATE \
LOG=/backup/restore_TEST_BACKUP.log
2.3 恢复指定表(追加方式)
./dimp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/backup/full_excluded_20250620.dmp \
TABLES=SYSDBA.TEST_DATA_TYPES \
TABLE_EXISTS_ACTION=APPEND \
IGNORE=Y
2.4 恢复多个表
./dimp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/backup/full_excluded_20250620.dmp \
TABLES="SYSDBA.TEST_BACKUP,SYSDBA.TEST_DATA_TYPES" \
TABLE_EXISTS_ACTION=REPLACE
3.备份与还原验证
3.1 创建测试数据
-- 创建新表存储不同类型的数据
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;
- 数据二(用来验证在恢复数据一对应的表时,数据二对应的表是否会被影响)
1. 员工表(成功保持)
CREATE TABLE SYSDBA.employee (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
department_id INT,
salary DECIMAL(10,2),
hire_date DATE DEFAULT CURRENT_DATE,
CONSTRAINT chk_salary CHECK (salary > 0)
);
2. 部门表(成功保持)
CREATE TABLE SYSDBA.department (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50) UNIQUE,
manager_id INT
);
3. 项目表(修复版)
-- 创建项目表(去掉自增标识)
CREATE TABLE SYSDBA.project (
project_id INT PRIMARY KEY,
project_name VARCHAR(100),
start_date DATE DEFAULT CURRENT_DATE,
end_date DATE
);
-- 创建项目ID序列
CREATE SEQUENCE project_seq START WITH 1001 INCREMENT BY 1;
4. 员工项目关联表(修复版)
CREATE TABLE SYSDBA.employee_project (
id INT PRIMARY KEY,
emp_id INT REFERENCES SYSDBA.employee(id) ON DELETE CASCADE,
project_id INT REFERENCES SYSDBA.project(project_id) ON DELETE SET NULL
);
5. 工资历史表(成功保持)
CREATE TABLE SYSDBA.salary_history (
id INT,
emp_id INT,
old_salary DECIMAL(10,2),
new_salary DECIMAL(10,2),
change_date DATE DEFAULT CURRENT_DATE
);
-- 1. 插入部门数据(department)
INSERT INTO SYSDBA.department (dept_id, dept_name, manager_id) VALUES
(1, '技术部', 101),
(2, '市场部', 103),
(3, '财务部', 104);
-- 2. 插入员工数据(employee)
INSERT INTO SYSDBA.employee (id, name, department_id, salary, hire_date) VALUES
(101, '张三', 1, 12000.00, '2020-03-15'),
(102, '李四', 1, 15000.00, '2019-07-22'),
(103, '王五', 2, 10000.00, '2021-11-05'),
(104, '赵六', 3, 13000.00, '2018-05-30'),
(105, '钱七', 2, 11000.00, '2022-01-10');
-- 3. 插入项目数据(project)- 使用序列
INSERT INTO SYSDBA.project (project_id, project_name, start_date, end_date) VALUES
(project_seq.NEXTVAL, '达梦数据库升级', '2025-01-10', '2025-06-30'),
(project_seq.NEXTVAL, '新零售系统开发', '2025-02-15', '2025-12-31'),
(project_seq.NEXTVAL, '财务系统迁移', '2025-03-01', NULL);
-- 4. 插入员工项目关联数据(employee_project)
INSERT INTO SYSDBA.employee_project (id, emp_id, project_id) VALUES
(1, 101, 1001), -- 张三参与达梦数据库升级
(2, 101, 1002), -- 张三参与新零售系统开发
(3, 102, 1001), -- 李四参与达梦数据库升级
(4, 103, 1002), -- 王五参与新零售系统开发
(5, 104, 1003), -- 赵六参与财务系统迁移
(6, 105, 1001); -- 钱七参与达梦数据库升级
-- 5. 插入工资历史数据(salary_history)
INSERT INTO SYSDBA.salary_history (emp_id, old_salary, new_salary, change_date) VALUES
(101, 11000.00, 12000.00, '2024-12-15'), -- 张三2024年加薪
(102, 13500.00, 15000.00, '2025-03-01'), -- 李四2025年加薪
(103, 9000.00, 10000.00, '2025-02-01'), -- 王五2025年加薪
(104, 12000.00, 13000.00, '2025-04-10'), -- 赵六2025年加薪
(101, 12000.00, 12500.00, '2025-06-01'), -- 张三2025年再次加薪
(105, 10000.00, 11000.00, '2025-05-01'); -- 钱七2025年加薪
-- 提交所有变更
COMMIT;
3.2 删除其中一张表的部分数据
-- 查询数据
SQL> select * from TEST_DATA_TYPES;
行号 id name price create_date active description
---------- ----------- --------------- ------ ----------- ------ ---------------------------------
1 1 标准商品 199.99 2023-01-15 Y 普通商品描述信息
2 2 限时特惠 99.5 2025-06-20 Y 促销活动的商品
3 3 已下架商品 299 2022-11-20 N 已停止销售的商品
4 4 会员专享 399 2025-05-21 Y 仅限会员购买
5 5 测试商品 0.01 2025-06-20 Y 用于系统测试的特殊商品
已用时间: 0.950(毫秒). 执行号:33003.
-- 删除部分数据
SQL> DELETE FROM TEST_DATA_TYPES WHERE id > 1;
影响行数 4
已用时间: 1.096(毫秒). 执行号:33004.
-- 再次查询数据
SQL> select * from TEST_DATA_TYPES;
行号 id name price create_date active description
---------- ----------- ------------ ------ ----------- ------ ------------------------
1 1 标准商品 199.99 2023-01-15 Y 普通商品描述信息
已用时间: 0.394(毫秒). 执行号:33005.
3.3 执行恢复命令进行恢复
[dmdba@localhost shell]$ dimp USERID='SYSDBA/"DaMeng@123"@localhost:5237' \
FILE=/home/dmdba/backup/full_excluded_20250623.dmp \
TABLES=TEST_DATA_TYPES \
TABLE_EXISTS_ACTION=TRUNCATE \
LOG=restore_TEST_BACKUP.log
dimp V8
version: 02134284194-20240820-239893-20108 Pack11
start dimp:
SYSDBA/******@localhost:5237 FILE=/home/dmdba/backup/full_excluded_20250623.dmp TABLES=TEST_DATA_TYPES TABLE_EXISTS_ACTION=TRUNCATE LOG=restore_TEST_BACKUP.log
本地编码:PG_UTF8, 导入文件编码:PG_UTF8
----- [2025-06-23 14:32:13]导入表:SYSDBA.TEST_DATA_TYPES -----
[1/15]创建表已完成,导入表 TEST_DATA_TYPES 的数据中...
导入表 SYSDBA.TEST_DATA_TYPES 的数据:5 行被处理, 大小 0.291 KB
[1/15]整个导入过程共花费 0.030 s
成功终止导入, 没有出现警告
3.4 再次确认数据是否已经恢复
SQL> select * from TEST_DATA_TYPES;
行号 id name price create_date active description
---------- ----------- --------------- ------ ----------- ------ ---------------------------------
1 1 标准商品 199.99 2023-01-15 Y 普通商品描述信息
2 2 限时特惠 99.5 2025-06-20 Y 促销活动的商品
3 3 已下架商品 299 2022-11-20 N 已停止销售的商品
4 4 会员专享 399 2025-05-21 Y 仅限会员购买
5 5 测试商品 0.01 2025-06-20 Y 用于系统测试的特殊商品
已用时间: 0.873(毫秒). 执行号:35901.
3.5 验证其他表数据是否被影响,我这边就不展示了,因为其他表数据正常,没被影响