在日常生活中我们会遇到对数据表的批量导出导入工作和一些批量备份还原工作,如果我们把这些工作定制成自动化工具会大大减小处理这些需求的时间,也会大大增加工作效率,下面我分享3个非常好用的shell小公举
,一下三个脚本所实现的功能如下,大家可以根据自己的口味选择使用呢,把他们加到定时任务(crontab)里可以实现对数据和数据表的定时操作,更舒服呢
工具介绍:
1.批量导出工具(带日志版)
2.批量导入工具(带日志版)
3.定时入库工具(对通过ftp传入的sql脚本实现定时自动入库并分类)
话不多说直接上活儿
1.批量导出工具(带日志版)
#!/bin/bash
export DM_HOME=/home/dmdba/dm/dmdbms # 根据你实际安装路径修改
export PATH=$DM_HOME/bin:$PATH
USERID="SYSDBA/PASSWORD@xxx.xxx.xxx.xxx"
DIRECTORY="/dbdata/DAOCHU/dexp_dmp_file" # 导出文件存放目录,需提前创建
LOGDIR="/dbdata/DAOCHU/dexp_dmp_log" # 日志目录,需提前创建
mkdir -p "$DIRECTORY" "$LOGDIR"
while IFS= read -r table; do
table_name=$(echo "$table" | cut -d'.' -f2)
dmp_file="${DIRECTORY}/${table_name}.dmp"
log_file="${LOGDIR}/${table_name}.log"
echo "正在导出表: $table"
dexp USERID=$USERID TABLES="$table" FILE="$dmp_file" LOG="$log_file"
done < /home/dmdba/dm/dmdbms/bin/template_table_daochu.txt批量导出工具(带日志版)--脚本解释
该工具可以实现通过模板表中配置的表名自动进行dmp导出工作,这么导出的好处有分表导出,对单表备份较为方便,减小逻辑备份进程备份整体模式的压力,部分模式存在历史表可选性教灵活,配合定时任务(crontab)可以实现日常备份的功能。
2.批量导入工具(带日志版)
#!/bin/bash
# 1. 配置达梦环境变量(根据实际安装路径修改)
export DM_HOME=/home/dmdba/dm/dmdbms
export PATH=$DM_HOME/bin:$PATH
# 2. 数据库连接信息、文件路径配置
USERID="SYSDBA/PASSWORD@xxx.xxx.xxx.xxx" # 数据库用户/密码@IP
IMP_DIRECTORY="/dbdata/DAORU/dimp_dmp_file" # dmp文件存放目录
LOGDIR="/dbdata/DAORU/dimp_dmp_log" # 导入日志目录,需提前创建
# 3. 确保目录存在
mkdir -p "$IMP_DIRECTORY" "$LOGDIR"
# 4. 批量导入逻辑:遍历dmp文件并执行导入
while IFS= read -r table_name; do
dmp_file="${IMP_DIRECTORY}/${table_name}.dmp"
log_file="${LOGDIR}/${table_name}_imp.log"
echo "正在导入表:${table_name},从文件 ${dmp_file} 导入"
dimp USERID=$USERID FILE="$dmp_file" LOG="$log_file" PARALLEL=64
done < /home/dmdba/dm/dmdbms/bin/template_table_daoru.txt # 表名列表文件批量导入工具(带日志版)--脚本解释
该工具可以实现通过模板表中配置的表名自动进行dmp导入工作,这么导入的好处有分表导入,对单表还原较为方便,减小逻辑还原进程还原整体模式的压力,配合定时任务(crontab)可以实现日常还原的功能。
3.定时入库工具(对通过ftp传入的sql脚本实现定时自动入库并分类)
#!/bin/bash
#=================================================
# DM8 自动入库脚本(按小时时间戳文件名)
# 1.扫描推送目录,匹配 INSERT_YYYYMMDDHH.sql
# 2.最多等待 50 min(10 轮,每轮 5 min),防止推送延迟
# 3.成功后把文件移到 archived,失败写日志
#=================================================
#--------用户可改参数--------
SRC_DIR="/dbdata/dmdata/dbdata/SQL_FILE"
ARC_DIR="/dbdata/dmdata/dbdata/archived"
LOG_FILE="/dbdata/dmdata/dbdata/SQL_FILE/auto_load.log"
# DM 连接信息
DM_USER="SYSDBA"
DM_PWD="PASSWORD"
DM_SERVER="xxx.xxx.xxx.xxx:xxxx"
#---------------------------
# 获取当前小时时间戳(UTC+8 示例)
CUR_HOUR=$(date +%Y%m%d%H)
TARGET_FILE="INSERT_${CUR_HOUR}.sql"
TARGET_PATH="${SRC_DIR}/${TARGET_FILE}"
echo "[$(date '+%F %T')] 本轮期望文件: ${TARGET_FILE}" >>${LOG_FILE}
# 最多扫描 10 次(50 min)
for i in {1..10}; do
if [ -f "${TARGET_PATH}" ]; then
echo "[$(date '+%F %T')] 发现文件,开始入库 …" >>${LOG_FILE}
# 调用 DM 客户端一次性执行
# -S 静默;-C 登录后即退出;-e 后面直接跟 SQL
cd /home/dmdba/dmdbms/bin
disql ${DM_USER}/${DM_PWD}@${DM_SERVER} <<EOF
start ${TARGET_PATH}
commit;
exit;
EOF
if [ $? -eq 0 ]; then
echo "[$(date '+%F %T')] 入库成功,移动文件到归档" >>${LOG_FILE}
mv "${TARGET_PATH}" "${ARC_DIR}/INSERT_${CUR_HOUR}_$(date +%s).sql"
exit 0
else
echo "[$(date '+%F %T')] 入库失败,保留文件待人工排查" >>${LOG_FILE}
exit 1
fi
else
echo "[$(date '+%F %T')] 第${i}次扫描未找到,等待 5 min …" >>${LOG_FILE}
sleep 300
fi
done
echo "[$(date '+%F %T')] 扫描 10 次后仍未找到 ${TARGET_FILE},放弃本轮" >>${LOG_FILE}
exit 2定时入库工具(对通过ftp传入的sql脚本实现定时自动入库并分类)--脚本解释
流程图:
开始
│
▼
生成目标文件名(INSERT_YYYYMMDDHH.sql)
│
▼
循环 10 次 ─────────────────────────────┐
│ │
▼ │
检查文件是否存在? │
│ │
├── 是 ──► 执行 disql 导入 │
│ │ │
│ ▼ │
│ 导入成功? │
│ │ │
│ 是 ──► 归档文件 ──► 退出(0) │
│ │ │
│ 否 ──► 记录错误 ──► 退出(1) │
│ │
└── 否 ──► 等待 5 分钟 ──────────────┘
│
▼
达到 10 次?──► 记录超时 ──► 退出(2)| 功能点 | 说明 |
|---|---|
| 定时扫描 | 每小时扫描指定目录,寻找特定格式的 SQL 文件 |
| 等待机制 | 最多等待 50 分钟(10 轮 × 5 分钟),应对文件推送延迟 |
| 自动导入 | 使用 DM8 的 disql 客户端执行 SQL 文件 |
| 归档管理 | 导入成功后移动到归档目录,失败则保留并记录日志 |
| 日志记录 | 全程记录操作日志,便于排查问题 |

评论已关闭