1.备份shell备份脚本dm_bak.sh参数解释COMPRESSY #启用压缩 BUFFER10240 #缓冲区大小 PARALLEL4 #备份启用线程#!/bin/bash# 全库备份排除指定表脚本增强日志版BAK_DIR/home/dmdba/backupDATE$(date%Y%m%d)TIMESTAMP$(date%Y-%m-%d_%H:%M:%S)# 设置需要排除的表名空格分隔EXCLUDE_TABLES(UNUSED_TABLE1TEMP_LOG_TABLE2ARCHIVE_DATA_TABLE3)# 日志函数带时间戳输出log(){localtimestamp$(date%Y-%m-%d %H:%M:%S)echo[${timestamp}]$1echo[${timestamp}]$1${BAK_DIR}/script_log_${DATE}.log}# 开始备份log 备份任务启动 log备份目录:${BAK_DIR}log排除表:${EXCLUDE_TABLES[]}log生成SQL查询语句...# 生成SQL查询语句SQL_QUERYSELECT OWNER || . || TABLE_NAME FROM DBA_TABLES WHERE OWNER NOT IN (SYS, SYSAUDITOR, SYSSSO) AND TABLE_NAME NOT IN (# 添加排除表fortablein${EXCLUDE_TABLES[]};doSQL_QUERY$table,doneSQL_QUERY${SQL_QUERY%,*});# 移除最后一个逗号log查询语句:${SQL_QUERY}log连接数据库获取表列表...# 获取表列表TABLE_LIST$(/home/dmdba/dmdbms/bin/disql-sSYSDBA/\DaMeng123\localhost:5237$SQL_QUERY|awkBEGIN{FS } NR2 /\./ {print $1}|tr\n,|seds/,$//)log获取到表列表:${TABLE_LIST}log开始执行备份...# 执行备份/home/dmdba/dmdbms/bin/dexpUSERIDSYSDBA/DaMeng123localhost:5237\FILE${BAK_DIR}/full_excluded_${DATE}.dmp\TABLES$TABLE_LIST\LOG${BAK_DIR}/full_excluded_${DATE}.log\COMPRESSY\BUFFER10240\PARALLEL4# 检查备份结果if[$?-eq0];thenBACKUP_SIZE$(du-h${BAK_DIR}/full_excluded_${DATE}.dmp|awk{print $1})log备份成功完成! 备份文件大小:${BACKUP_SIZE}log排除表:${EXCLUDE_TABLES[]}log备份日志:${BAK_DIR}/full_excluded_${DATE}.logelselog备份失败! 错误代码:$?log请检查日志文件:${BAK_DIR}/full_excluded_${DATE}.logfilog 备份任务结束 2.还原达梦数据库的dimp工具中TABLE_EXISTS_ACTION参数用于指定当要导入的表已经存在时的处理方式请按照自己需要替换参数如果表结构未改变使用TRUNCATE也是常用和比较安全的方式因为不会改变原表的索引和约束且恢复快推荐使用如果表结构有改变使用REPLACE最彻底的恢复完全恢复到备份时的状态2.1 恢复整个备份包./dimp USERIDSYSDBA/DaMeng123localhost:5237\FILE/backup/full_excluded_20250620.dmp2.2 恢复指定表覆盖方式./dimp USERIDSYSDBA/DaMeng123localhost:5237\FILE/backup/full_excluded_20250620.dmp \TABLESSYSDBA.TEST_BACKUP \ TABLE_EXISTS_ACTIONTRUNCATE\ LOG/backup/restore_TEST_BACKUP.log2.3 恢复指定表追加方式IGNOREY忽略错误主键冲突时使用./dimp USERIDSYSDBA/DaMeng123localhost:5237\FILE/backup/full_excluded_20250620.dmp \TABLESSYSDBA.TEST_DATA_TYPES \ TABLE_EXISTS_ACTIONAPPEND \IGNOREY2.4 恢复多个表./dimp USERIDSYSDBA/DaMeng123localhost:5237\FILE/backup/full_excluded_20250620.dmp \TABLESSYSDBA.TEST_BACKUP,SYSDBA.TEST_DATA_TYPES\ TABLE_EXISTS_ACTIONREPLACE3.备份与还原验证3.1 创建测试数据数据一主要用来做恢复的表-- 创建新表存储不同类型的数据CREATETABLETEST_DATA_TYPES(idINTPRIMARYKEY,nameVARCHAR(100),priceDECIMAL(10,2),create_dateDATE,activeCHAR(1),descriptionTEXT);-- 插入多种数据类型的数据INSERTINTOTEST_DATA_TYPES(id,name,price,create_date,active,description)VALUES(1,标准商品,199.99,DATE2023-01-15,Y,普通商品描述信息),(2,限时特惠,99.50,SYSDATE,Y,促销活动的商品),(3,已下架商品,299.00,DATE2022-11-20,N,已停止销售的商品),(4,会员专享,399.00,ADD_DAYS(SYSDATE,-30),Y,仅限会员购买),(5,测试商品,0.01,SYSDATE,Y,用于系统测试的特殊商品);COMMIT;-- 验证数据SELECT*FROMTEST_DATA_TYPES;数据二用来验证在恢复数据一对应的表时数据二对应的表是否会被影响1.员工表成功保持CREATETABLESYSDBA.employee(idINTPRIMARYKEY,nameVARCHAR(50)NOTNULL,department_idINT,salaryDECIMAL(10,2),hire_dateDATEDEFAULTCURRENT_DATE,CONSTRAINTchk_salaryCHECK(salary0));2.部门表成功保持CREATETABLESYSDBA.department(dept_idINTPRIMARYKEY,dept_nameVARCHAR(50)UNIQUE,manager_idINT);3.项目表修复版-- 创建项目表去掉自增标识CREATETABLESYSDBA.project(project_idINTPRIMARYKEY,project_nameVARCHAR(100),start_dateDATEDEFAULTCURRENT_DATE,end_dateDATE);-- 创建项目ID序列CREATESEQUENCE project_seqSTARTWITH1001INCREMENTBY1;4.员工项目关联表修复版CREATETABLESYSDBA.employee_project(idINTPRIMARYKEY,emp_idINTREFERENCESSYSDBA.employee(id)ONDELETECASCADE,project_idINTREFERENCESSYSDBA.project(project_id)ONDELETESETNULL);5.工资历史表成功保持CREATETABLESYSDBA.salary_history(idINT,emp_idINT,old_salaryDECIMAL(10,2),new_salaryDECIMAL(10,2),change_dateDATEDEFAULTCURRENT_DATE);-- 1. 插入部门数据departmentINSERTINTOSYSDBA.department(dept_id,dept_name,manager_id)VALUES(1,技术部,101),(2,市场部,103),(3,财务部,104);-- 2. 插入员工数据employeeINSERTINTOSYSDBA.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- 使用序列INSERTINTOSYSDBA.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_projectINSERTINTOSYSDBA.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_historyINSERTINTOSYSDBA.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 删除其中一张表的部分数据-- 查询数据SQLselect*fromTEST_DATA_TYPES;行号 id name price create_date active description---------- ----------- --------------- ------ ----------- ------ ---------------------------------11标准商品199.992023-01-15Y 普通商品描述信息22限时特惠99.52025-06-20Y 促销活动的商品33已下架商品2992022-11-20N 已停止销售的商品44会员专享3992025-05-21Y 仅限会员购买55测试商品0.012025-06-20Y 用于系统测试的特殊商品 已用时间:0.950(毫秒).执行号:33003.-- 删除部分数据SQLDELETEFROMTEST_DATA_TYPESWHEREid1;影响行数4已用时间:1.096(毫秒).执行号:33004.-- 再次查询数据SQLselect*fromTEST_DATA_TYPES;行号 id name price create_date active description---------- ----------- ------------ ------ ----------- ------ ------------------------11标准商品199.992023-01-15Y 普通商品描述信息 已用时间:0.394(毫秒).执行号:33005.3.3 执行恢复命令进行恢复[dmdbalocalhost shell]$ dimpUSERIDSYSDBA/DaMeng123localhost:5237\FILE/home/dmdba/backup/full_excluded_20250623.dmp\TABLESTEST_DATA_TYPES\TABLE_EXISTS_ACTIONTRUNCATE\LOGrestore_TEST_BACKUP.log dimp V8 version: 02134284194-20240820-239893-20108 Pack11 start dimp: SYSDBA/******localhost:5237FILE/home/dmdba/backup/full_excluded_20250623.dmpTABLESTEST_DATA_TYPESTABLE_EXISTS_ACTIONTRUNCATELOGrestore_TEST_BACKUP.log 本地编码PG_UTF8, 导入文件编码PG_UTF8 -----[2025-06-2314:32:13]导入表SYSDBA.TEST_DATA_TYPES -----[1/15]创建表已完成导入表 TEST_DATA_TYPES 的数据中... 导入表 SYSDBA.TEST_DATA_TYPES 的数据5 行被处理, 大小0.291KB[1/15]整个导入过程共花费0.030s 成功终止导入, 没有出现警告3.4 再次确认数据是否已经恢复SQLselect*fromTEST_DATA_TYPES;行号 id name price create_date active description---------- ----------- --------------- ------ ----------- ------ ---------------------------------11标准商品199.992023-01-15Y 普通商品描述信息22限时特惠99.52025-06-20Y 促销活动的商品33已下架商品2992022-11-20N 已停止销售的商品44会员专享3992025-05-21Y 仅限会员购买55测试商品0.012025-06-20Y 用于系统测试的特殊商品 已用时间:0.873(毫秒).执行号:35901.3.5 验证其他表数据是否被影响我这边就不展示了因为其他表数据正常没被影响
达梦数据库脚本备份与手动恢复数据
1.备份shell备份脚本dm_bak.sh参数解释COMPRESSY #启用压缩 BUFFER10240 #缓冲区大小 PARALLEL4 #备份启用线程#!/bin/bash# 全库备份排除指定表脚本增强日志版BAK_DIR/home/dmdba/backupDATE$(date%Y%m%d)TIMESTAMP$(date%Y-%m-%d_%H:%M:%S)# 设置需要排除的表名空格分隔EXCLUDE_TABLES(UNUSED_TABLE1TEMP_LOG_TABLE2ARCHIVE_DATA_TABLE3)# 日志函数带时间戳输出log(){localtimestamp$(date%Y-%m-%d %H:%M:%S)echo[${timestamp}]$1echo[${timestamp}]$1${BAK_DIR}/script_log_${DATE}.log}# 开始备份log 备份任务启动 log备份目录:${BAK_DIR}log排除表:${EXCLUDE_TABLES[]}log生成SQL查询语句...# 生成SQL查询语句SQL_QUERYSELECT OWNER || . || TABLE_NAME FROM DBA_TABLES WHERE OWNER NOT IN (SYS, SYSAUDITOR, SYSSSO) AND TABLE_NAME NOT IN (# 添加排除表fortablein${EXCLUDE_TABLES[]};doSQL_QUERY$table,doneSQL_QUERY${SQL_QUERY%,*});# 移除最后一个逗号log查询语句:${SQL_QUERY}log连接数据库获取表列表...# 获取表列表TABLE_LIST$(/home/dmdba/dmdbms/bin/disql-sSYSDBA/\DaMeng123\localhost:5237$SQL_QUERY|awkBEGIN{FS } NR2 /\./ {print $1}|tr\n,|seds/,$//)log获取到表列表:${TABLE_LIST}log开始执行备份...# 执行备份/home/dmdba/dmdbms/bin/dexpUSERIDSYSDBA/DaMeng123localhost:5237\FILE${BAK_DIR}/full_excluded_${DATE}.dmp\TABLES$TABLE_LIST\LOG${BAK_DIR}/full_excluded_${DATE}.log\COMPRESSY\BUFFER10240\PARALLEL4# 检查备份结果if[$?-eq0];thenBACKUP_SIZE$(du-h${BAK_DIR}/full_excluded_${DATE}.dmp|awk{print $1})log备份成功完成! 备份文件大小:${BACKUP_SIZE}log排除表:${EXCLUDE_TABLES[]}log备份日志:${BAK_DIR}/full_excluded_${DATE}.logelselog备份失败! 错误代码:$?log请检查日志文件:${BAK_DIR}/full_excluded_${DATE}.logfilog 备份任务结束 2.还原达梦数据库的dimp工具中TABLE_EXISTS_ACTION参数用于指定当要导入的表已经存在时的处理方式请按照自己需要替换参数如果表结构未改变使用TRUNCATE也是常用和比较安全的方式因为不会改变原表的索引和约束且恢复快推荐使用如果表结构有改变使用REPLACE最彻底的恢复完全恢复到备份时的状态2.1 恢复整个备份包./dimp USERIDSYSDBA/DaMeng123localhost:5237\FILE/backup/full_excluded_20250620.dmp2.2 恢复指定表覆盖方式./dimp USERIDSYSDBA/DaMeng123localhost:5237\FILE/backup/full_excluded_20250620.dmp \TABLESSYSDBA.TEST_BACKUP \ TABLE_EXISTS_ACTIONTRUNCATE\ LOG/backup/restore_TEST_BACKUP.log2.3 恢复指定表追加方式IGNOREY忽略错误主键冲突时使用./dimp USERIDSYSDBA/DaMeng123localhost:5237\FILE/backup/full_excluded_20250620.dmp \TABLESSYSDBA.TEST_DATA_TYPES \ TABLE_EXISTS_ACTIONAPPEND \IGNOREY2.4 恢复多个表./dimp USERIDSYSDBA/DaMeng123localhost:5237\FILE/backup/full_excluded_20250620.dmp \TABLESSYSDBA.TEST_BACKUP,SYSDBA.TEST_DATA_TYPES\ TABLE_EXISTS_ACTIONREPLACE3.备份与还原验证3.1 创建测试数据数据一主要用来做恢复的表-- 创建新表存储不同类型的数据CREATETABLETEST_DATA_TYPES(idINTPRIMARYKEY,nameVARCHAR(100),priceDECIMAL(10,2),create_dateDATE,activeCHAR(1),descriptionTEXT);-- 插入多种数据类型的数据INSERTINTOTEST_DATA_TYPES(id,name,price,create_date,active,description)VALUES(1,标准商品,199.99,DATE2023-01-15,Y,普通商品描述信息),(2,限时特惠,99.50,SYSDATE,Y,促销活动的商品),(3,已下架商品,299.00,DATE2022-11-20,N,已停止销售的商品),(4,会员专享,399.00,ADD_DAYS(SYSDATE,-30),Y,仅限会员购买),(5,测试商品,0.01,SYSDATE,Y,用于系统测试的特殊商品);COMMIT;-- 验证数据SELECT*FROMTEST_DATA_TYPES;数据二用来验证在恢复数据一对应的表时数据二对应的表是否会被影响1.员工表成功保持CREATETABLESYSDBA.employee(idINTPRIMARYKEY,nameVARCHAR(50)NOTNULL,department_idINT,salaryDECIMAL(10,2),hire_dateDATEDEFAULTCURRENT_DATE,CONSTRAINTchk_salaryCHECK(salary0));2.部门表成功保持CREATETABLESYSDBA.department(dept_idINTPRIMARYKEY,dept_nameVARCHAR(50)UNIQUE,manager_idINT);3.项目表修复版-- 创建项目表去掉自增标识CREATETABLESYSDBA.project(project_idINTPRIMARYKEY,project_nameVARCHAR(100),start_dateDATEDEFAULTCURRENT_DATE,end_dateDATE);-- 创建项目ID序列CREATESEQUENCE project_seqSTARTWITH1001INCREMENTBY1;4.员工项目关联表修复版CREATETABLESYSDBA.employee_project(idINTPRIMARYKEY,emp_idINTREFERENCESSYSDBA.employee(id)ONDELETECASCADE,project_idINTREFERENCESSYSDBA.project(project_id)ONDELETESETNULL);5.工资历史表成功保持CREATETABLESYSDBA.salary_history(idINT,emp_idINT,old_salaryDECIMAL(10,2),new_salaryDECIMAL(10,2),change_dateDATEDEFAULTCURRENT_DATE);-- 1. 插入部门数据departmentINSERTINTOSYSDBA.department(dept_id,dept_name,manager_id)VALUES(1,技术部,101),(2,市场部,103),(3,财务部,104);-- 2. 插入员工数据employeeINSERTINTOSYSDBA.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- 使用序列INSERTINTOSYSDBA.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_projectINSERTINTOSYSDBA.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_historyINSERTINTOSYSDBA.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 删除其中一张表的部分数据-- 查询数据SQLselect*fromTEST_DATA_TYPES;行号 id name price create_date active description---------- ----------- --------------- ------ ----------- ------ ---------------------------------11标准商品199.992023-01-15Y 普通商品描述信息22限时特惠99.52025-06-20Y 促销活动的商品33已下架商品2992022-11-20N 已停止销售的商品44会员专享3992025-05-21Y 仅限会员购买55测试商品0.012025-06-20Y 用于系统测试的特殊商品 已用时间:0.950(毫秒).执行号:33003.-- 删除部分数据SQLDELETEFROMTEST_DATA_TYPESWHEREid1;影响行数4已用时间:1.096(毫秒).执行号:33004.-- 再次查询数据SQLselect*fromTEST_DATA_TYPES;行号 id name price create_date active description---------- ----------- ------------ ------ ----------- ------ ------------------------11标准商品199.992023-01-15Y 普通商品描述信息 已用时间:0.394(毫秒).执行号:33005.3.3 执行恢复命令进行恢复[dmdbalocalhost shell]$ dimpUSERIDSYSDBA/DaMeng123localhost:5237\FILE/home/dmdba/backup/full_excluded_20250623.dmp\TABLESTEST_DATA_TYPES\TABLE_EXISTS_ACTIONTRUNCATE\LOGrestore_TEST_BACKUP.log dimp V8 version: 02134284194-20240820-239893-20108 Pack11 start dimp: SYSDBA/******localhost:5237FILE/home/dmdba/backup/full_excluded_20250623.dmpTABLESTEST_DATA_TYPESTABLE_EXISTS_ACTIONTRUNCATELOGrestore_TEST_BACKUP.log 本地编码PG_UTF8, 导入文件编码PG_UTF8 -----[2025-06-2314:32:13]导入表SYSDBA.TEST_DATA_TYPES -----[1/15]创建表已完成导入表 TEST_DATA_TYPES 的数据中... 导入表 SYSDBA.TEST_DATA_TYPES 的数据5 行被处理, 大小0.291KB[1/15]整个导入过程共花费0.030s 成功终止导入, 没有出现警告3.4 再次确认数据是否已经恢复SQLselect*fromTEST_DATA_TYPES;行号 id name price create_date active description---------- ----------- --------------- ------ ----------- ------ ---------------------------------11标准商品199.992023-01-15Y 普通商品描述信息22限时特惠99.52025-06-20Y 促销活动的商品33已下架商品2992022-11-20N 已停止销售的商品44会员专享3992025-05-21Y 仅限会员购买55测试商品0.012025-06-20Y 用于系统测试的特殊商品 已用时间:0.873(毫秒).执行号:35901.3.5 验证其他表数据是否被影响我这边就不展示了因为其他表数据正常没被影响