达梦数据库脚本备份与手动恢复数据

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 恢复指定表(追加方式)

  • IGNORE=Y,忽略错误,主键冲突时使用
./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 验证其他表数据是否被影响,我这边就不展示了,因为其他表数据正常,没被影响

 

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