跨服务器同步数据库tar包数据

打印 上一主题 下一主题

主题 1032|帖子 1032|积分 3096

跨服务器同步数据库tar包数据

   简介:将FTP/SFTP服务器上的数据库tar包数据周期同步到对应数据库中。
  一、数据同步

(一)查找最新tar包并进行解压缩及同步到指定服务器 scpDmp.sh


  • scpDmp.sh代码如下:
   该脚本的主要功能是在指定目次中查找最新的 .tar 文件,查抄该文件是否已经处理过。如果未处理过,则将其文件名记载到一个文件中,然后解压缩该 .tar 文件,接着找出解压缩后最新的 .DMP 文件,并将其通过 scp 下令复制到长途服务器。
  1. #!/bin/bash
  2. # 指定脚本使用的解释器为 Bash
  3. PATH=/bin:/usr/bin
  4. # 设置环境变量 PATH,将 /bin 和 /usr/bin 加入到可执行文件的搜索路径中
  5. export PATH
  6. # 导出 PATH 环境变量,使其对后续的子进程也生效
  7. (
  8. # 使用括号将后续代码块括起来,表示在子 shell 中执行,这样可以避免对当前 shell 环境产生影响
  9. record_file="/文件路径/processed_files.txt"
  10. # 定义一个变量 record_file,用于存储已经处理过的文件的记录文件的路径
  11. existing_filenames=()
  12. # 定义一个空数组 existing_filenames,用于存储已经处理过的文件的文件名
  13. while IFS= read -r line; do
  14.     existing_filenames+=("$line")
  15. done < "$record_file"
  16. # 使用 while 循环逐行读取 record_file 文件中的内容
  17. # IFS= 表示不进行字段分割,read -r 表示不处理反斜杠转义字符
  18. # 每次读取一行内容后,将其添加到 existing_filenames 数组中
  19. cd /tar包存放路径/
  20. # 切换到指定目录 /tar包存放路径/
  21. latest_tar_file=$(find -name '*.tar' -type f -printf '%T@ %p\n' | sort -n | tail -1 | awk '{print $2}')
  22. # 使用 find 命令查找当前目录下所有扩展名为 .tar 的文件
  23. # -name '*.tar' 表示查找文件名以 .tar 结尾的文件
  24. # -type f 表示只查找普通文件
  25. # -printf '%T@ %p\n' 表示输出文件的修改时间戳和文件名,中间用空格分隔
  26. # sort -n 表示按数字顺序对输出进行排序
  27. # tail -1 表示取排序后的最后一行,即最新的文件
  28. # awk '{print $2}' 表示提取每行的第二个字段,即文件名
  29. # 将最终结果赋值给变量 latest_tar_file
  30. filename=$(basename "$latest_tar_file")
  31. # 使用 basename 命令获取 latest_tar_file 的文件名部分,去除路径信息,并赋值给变量 filename
  32. for existing_filename in "${existing_filenames[@]}"; do
  33.     if [ "$filename" == "$existing_filename" ]; then
  34.         echo "The file $filename has already been processed. Skipping this operation."
  35.         exit 0
  36.     fi
  37. done
  38. # 遍历 existing_filenames 数组中的每个元素
  39. # 如果当前文件名 filename 与数组中的某个元素相等,则表示该文件已经处理过
  40. # 输出提示信息并使用 exit 0 命令正常退出脚本
  41. echo "$filename" >> "$record_file"
  42. # 如果文件未处理过,则将其文件名追加到 record_file 文件中
  43. tar -xvf "$latest_tar_file"
  44. # 使用 tar 命令解压缩最新的 .tar 文件
  45. # -x 表示解压缩
  46. # -v 表示显示详细信息
  47. # -f 表示指定要解压缩的文件
  48. dump_filename=$(find /opt/da1/ftpfile/zbdczx -name '*.DMP' -type f -printf '%T@ %p\n' | sort -n | tail -1 | awk '{print $NF}')
  49. # 使用 find 命令查找 /opt/da1/ftpfile/zbdczx 目录下所有扩展名为 .DMP 的文件
  50. # 同样使用排序和取最后一行的方法找到最新的 .DMP 文件
  51. # awk '{print $NF}' 表示提取每行的最后一个字段,即文件名
  52. # 将最终结果赋值给变量 dump_filename
  53. scp /解压缩文件路径/$dump_filename 远程服务器的用户名@目标服务器:/目标存储路径
  54. # 使用 scp 命令将最新的 .DMP 文件复制到远程服务器
  55. # 远程服务器的用户名可以采用 root。
  56. )
  57. # 子 shell 代码块结束
复制代码
  注意事项
1、脚本需要确保 record_file 文件存在,而且有读写权限。
2、脚本需要确保 scp 下令可以正常利用,而且长途服务器的 SSH 服务正常运行,同时具有相应的访问权限。
3、脚本中的 IP 地址和路径信息需要根据实际情况进行修改。
  (二) Docker 容器dateDmp.sh

1.dateDmp.sh该脚本的主要功能是在指定目次 /目标存储路径 中查找最新的 .DMP 文件,查抄该文件是否已经处理过。如果未处理过,则记载该文件名,修改文件权限,将其复制到一个名为 oracle11g_ee 的 Docker 容器内,最后在容器内实行一个脚本 runImpdp.sh 并将输出重定向到 /dev/nul(即抛弃输出)。
  1. #!/bin/bash
  2. # 指定脚本使用的解释器为 Bash
  3. PATH=/bin:/usr/bin
  4. # 设置环境变量 PATH,将 /bin 和 /usr/bin 加入到可执行文件的搜索路径中
  5. export PATH
  6. # 导出 PATH 环境变量,使其对后续的子进程也生效
  7. (
  8. # 使用括号将后续代码块括起来,表示在子 shell 中执行,这样可以避免对当前 shell 环境产生影响
  9. record_file="/opt/oracle_mnt/processed_files.txt"
  10. # 定义一个变量 record_file,用于存储已经处理过的文件的记录文件的路径
  11. existing_filenames=()
  12. # 定义一个空数组 existing_filenames,用于存储已经处理过的文件的文件名
  13. while IFS= read -r line; do
  14.     existing_filenames+=("$line")
  15. done < "$record_file"
  16. # 使用 while 循环逐行读取 record_file 文件中的内容
  17. # IFS= 表示不进行字段分割,read -r 表示不处理反斜杠转义字符
  18. # 每次读取一行内容后,将其添加到 existing_filenames 数组中
  19. cd /opt/oracle_mnt
  20. # 切换到指定目录 /opt/oracle_mnt
  21. latest_dmp_file=$(find /opt/oracle_mnt -name '*.DMP' -type f -printf '%T@ %p\n' | sort -n | tail -1 | awk '{print $NF}')
  22. # 使用 find 命令查找 /opt/oracle_mnt 目录下所有扩展名为 .DMP 的文件
  23. # -name '*.DMP' 表示查找文件名以 .DMP 结尾的文件
  24. # -type f 表示只查找普通文件
  25. # -printf '%T@ %p\n' 表示输出文件的修改时间戳和文件名,中间用空格分隔
  26. # sort -n 表示按数字顺序对输出进行排序
  27. # tail -1 表示取排序后的最后一行,即最新的文件
  28. # awk '{print $NF}' 表示提取每行的最后一个字段,即文件名
  29. # 将最终结果赋值给变量 latest_dmp_file
  30. filename=$(basename "$latest_dmp_file")
  31. # 使用 basename 命令获取 latest_dmp_file 的文件名部分,去除路径信息,并赋值给变量 filename
  32. for existing_filename in "${existing_filenames[@]}"; do
  33.     if [ "$filename" == "$existing_filename" ]; then
  34.         echo "The file $filename has already been processed. Skipping this operation."
  35.         exit 0
  36.     fi
  37. done
  38. # 遍历 existing_filenames 数组中的每个元素
  39. # 如果当前文件名 filename 与数组中的某个元素相等,则表示该文件已经处理过
  40. # 输出提示信息并使用 exit 0 命令正常退出脚本
  41. echo "$filename" >> "$record_file"
  42. # 如果文件未处理过,则将其文件名追加到 record_file 文件中
  43. chmod 777 $filename
  44. # 修改最新的 .DMP 文件的权限为 777,即所有用户都具有读、写、执行权限
  45. docker cp /opt/oracle_mnt/$filename oracle11g_ee:/opt/oracle_mnt
  46. # 使用 docker cp 命令将本地文件 /opt/oracle_mnt/$filename 复制到名为 oracle11g_ee 的 Docker 容器内的 /opt/oracle_mnt 目录下
  47. docker exec oracle11g_ee sh /opt/oracle_mnt/runImpdp.sh > /dev/nul
  48. # 使用 docker exec 命令在名为 oracle11g_ee 的 Docker 容器内执行脚本 /opt/oracle_mnt/runImpdp.sh
  49. # > /dev/nul 表示将脚本的输出重定向到 /dev/nul,即丢弃输出
复制代码
  注意事项
确保 record_file 文件存在且具有读写权限。
确保 oracle11g_ee 容器正在运行,否则 docker cp 和 docker exec 下令会失败。
修改文件权限为 777 可能存在安全风险,发起根据实际情况调整权限。
脚本中 runImpdp.sh 脚本的具体内容需要确保精确,否则可能会导致实行失败。
  (三)runImpdp.sh 脚本


  • 此脚本的主要目的是在 /opt/oracle_mnt 目次下找出最新的 .DMP 文件,然后利用 Oracle 的数据泵导入工具 impdp 将该 .DMP 文件中的数据导入到 Oracle 数据库中,并生成一个包含当前日期的日记文件。
  1. #!/bin/bash
  2. # 这是一个 Shebang 行,它指定了该脚本将使用 Bash 解释器来执行。
  3. PATH=/bin:/usr/bin
  4. # 重新设置环境变量 `PATH`,将 `/bin` 和 `/usr/bin` 目录添加到可执行文件的搜索路径中。这确保脚本在执行时可以找到常用的系统命令。
  5. export PATH
  6. # 导出 `PATH` 环境变量,使得在当前脚本及其子进程中都可以使用这个设置的搜索路径。
  7. (
  8. # 括号 `()` 表示开启一个子 shell。在子 shell 中执行脚本代码可以避免对当前父 shell 环境产生影响,子 shell 中的变量和环境设置不会泄漏到父 shell 中。
  9. cd /opt/oracle_mnt
  10. # 切换当前工作目录到 `/opt/oracle_mnt`。后续的文件查找和操作都将基于这个目录进行。
  11. su oracle
  12. # 尝试切换当前用户为 `oracle`。通常在操作 Oracle 数据库时,需要使用 `oracle` 用户,因为该用户拥有数据库相关操作的权限。但这里存在一个问题,`su oracle` 是交互式命令,在脚本中直接使用可能不会按预期工作,它需要输入 `oracle` 用户的密码。如果要非交互式切换用户,应该使用 `su - oracle -c 'command'` 这种形式。
  13. filename=$(find /opt/oracle_mnt -name '*.DMP' -type f -printf '%T@ %p\n' | sort -n | tail -1 | awk '{print $NF}')
  14. # 使用 `find` 命令在 `/opt/oracle_mnt` 目录下查找所有扩展名为 `.DMP` 的普通文件(`-type f`)。
  15. # `-printf '%T@ %p\n'` 表示输出每个文件的修改时间戳(以秒为单位)和文件名,中间用空格分隔。
  16. # `sort -n` 按数字顺序对输出进行排序,时间戳较新的文件排在后面。
  17. # `tail -1` 取排序后的最后一行,即最新修改的 `.DMP` 文件。
  18. # `awk '{print $NF}'` 提取这一行的最后一个字段,也就是文件名,并将其存储在变量 `filename` 中。
  19. /opt/oracle/product/11.2.0/dbhome_1/bin/impdp 'DMBDC/BDCzx_123'@orcl directory=data_dir dumpfile=$filename table_exists_action=replace EXCLUDE=VIEW,TYPE_BODY,TYPE,INDEX,SEQUENCE,PACKAGE,FUNCTION,PROCEDURE,TRIGGER,JOB logfile=bdc$sj.log
  20. # 调用 Oracle 数据泵导入工具 `impdp` 进行数据导入操作。具体参数解释如下:
  21. # - `'AZQXC/123456'@orcl`:指定连接到 Oracle 数据库的用户名、密码和数据库服务名,这里表示使用 `AZQXC` 用户,密码是 `123456`,连接到 `orcl` 数据库实例。
  22. # - `directory=data_dir`:指定数据泵操作使用的目录对象 `data_dir`,该目录对象应该在数据库中已经创建并指向 `/opt/oracle_mnt` 目录。
  23. # - `dumpfile=$filename`:指定要导入的 `.DMP` 文件,即前面找到的最新的 `.DMP` 文件。
  24. # - `table_exists_action=replace`:如果目标表已经存在,将替换现有的表。
  25. # - `EXCLUDE=VIEW,TYPE_BODY,TYPE,INDEX,SEQUENCE,PACKAGE,FUNCTION,PROCEDURE,TRIGGER,JOB`:在导入过程中排除视图、类型体、类型、索引、序列、包、函数、过程、触发器和作业等对象。
  26. # - `logfile=abc$sj.log`:指定导入操作的日志文件名为 `bdc` 加上当前日期,例如 `abc20241001.log`。
  27. )
  28. # 子 shell 结束。
复制代码
  存在的问题及改进发起
su 下令问题:su oracle 在脚本中交互式切换用户可能无法正常工作,发起改为 su - oracle -c ‘后续下令’ 的情势,将后续的 impdp 等操作放在 su - oracle -c 的引号内实行。
错误处理:脚本中没有对可能出现的错误进行处理,例如 find 下令找不到 .DMP 文件、impdp 导入失败等情况。可以添加相应的错误查抄和处理逻辑,进步脚本的结实性。
权限问题:确保实行脚本的用户有足够的权限切换到 oracle 用户,而且 oracle 用户对 /opt/oracle_mnt 目次和相关文件有读写权限。
  二、周期脚本数据同步策略

(一)linux设置调度周期


  • 编辑 crontab 文件
   crontab 是 Linux 体系中用于定期实行使命的工具,其设置格式为:
分钟 小时 日 月 周 要实行的下令
利用以下下令编辑当前用户的 crontab 文件:
  1. crontab -e
复制代码
  果是第一次编辑,体系会让你选择一个文本编辑器,选择你熟悉的编辑器即可(如 nano 或 vim)。
  

  • 添加使命
  1. FTP服务器:
  2. 0 14 * * 6 /绝对路径//scpDmp.sh > /绝对路径/script_log.log
复制代码
  0:表示分钟,即每个小时的第 0 分钟,也就是整点时刻。
14:表示小时,即每天的 14 点(下午 2 点)。
*:是通配符,在 “日” 和 “月” 的位置表示每天、每月都实行。
6:表示周,在 crontab 里,0 或 7 代表周日,1 到 6 分别代表周一到周六,以是这里 6 表示周六。
/绝对路径/scpDmp.sh:利用 bash 解释器来实行 /绝对路径/scpDmp.sh 脚本。
/绝对路径/script_log.log:将脚本实行过程中的标准输出重定向到 /绝对路径/script_log.log 文件中,如许脚本运行的输出信息都会被记载到该日记文件里。
  1. 数据库服务器:
  2. 00 19 * * 6 /bin/bash /path/to/dateDmp.sh >> /opt/oracle_mnt/bdcdateDmp.log
复制代码
  

  • 时间设置部分
    00 19 * * 6 用于指定使命实行的时间,crontab 时间设置格式遵照 “分 时 日 月 周” 的规则:
    分钟(00):表示每个小时的第 0 分钟,也就是整点时刻。
    小时(19):表示 24 小时制的 19 点,即晚上 7 点。
    日期(): 是通配符,意味着对日期没有限制,每个月的恣意一天都可能实行该使命(结合背面的星限期制)。
    月份(*):同样利用 * 作为通配符,代表对月份没有限制,每年的每个月都可以实行该使命。
    星期(6):在 crontab 里,0 或 7 代表周日,1 到 6 分别代表周一到周六,以是这里的 6 表示周六。
    综合起来,该使命会在每周六的 19:00 实行。
  

  • 实行下令部分
    /bin/bash /path/to/dateDmp.sh 表示利用 bash 解释器来实行 /path/to/dateDmp.sh 脚本。需要确保以下几点:
    脚本文件存在于指定路径 /path/to/ 下。
    脚本文件具有可实行权限,可以利用 chmod +x /path/to/dateDmp.sh 下令添加实行权限。
  • 输出重定向部分
      /opt/oracle_mnt/bdcdateDmp.log 表示将脚本实行的标准输出以追加的方式重定向到 /opt/oracle_mnt/bdcdateDmp.log 文件中。具体解释如下:是追加重定向符号,它会把新的输出内容添加到文件末尾,而不会覆盖原有的内容。
/opt/oracle_mnt/bdcdateDmp.log 是日记文件的路径,要保证明行 crontab 使命的用户对该文件地点目次有写入权限,否则日记文件可能无法正常生成或写入内容。
注意事项
环境变量:crontab 使命实行时的环境变量和交互式登录时可能不同。如果脚本依靠特定的环境变量,需要在脚本里显式设置大概通过其他方式加载环境变量。
错误输出:此设置只处理了标准输出(stdout),如果脚本实行过程中产生错误信息(标准错误输出 stderr),不会被记载到该日记文件中。若想同时记载错误信息,可以利用 2>&1 将标准错误输出也重定向到标准输出,如 00 19 * * 6 /bin/bash /path/to/dateDmp.sh >> /opt/oracle_mnt/bdcdateDmp.log 2>&1。
   

  • 保存并退出
  1. 在 nano 编辑器中,按 Ctrl + X,然后按 Y 确认保存,最后按 Enter 键退出。在 vim 编辑器中,按 Esc 键,输入 :wq 并按 Enter 键保存并退出。
复制代码

  • 验证设置
  1. crontab -l
复制代码
(二)windows设置调度周期

在 Windows 体系中,可以利用使命计划程序来设置使命的调度周期。以下是将脚本设置为每周一实行的步骤:

  • 打开使命计划程序
  1. 在开始菜单中搜索 “任务计划程序” 并打开。
复制代码

  • 创建使命
    在使命计划程序中,点击 “创建使命”,在弹出的窗口中进行以下设置:
  1. 常规:为任务设置一个名称和描述。
  2. 触发器:点击 “新建”,在 “开始任务” 中选择 “按计划”,在 “计划类型” 中选择 “每周”,勾选 “星期一”,设置开始日期和时间,然后点击 “确定”。
  3. 操作:点击 “新建”,在 “操作” 中选择 “启动程序”,在 “程序 / 脚本” 中浏览并选择要执行的脚本文件(如果是批处理脚本,选择 .bat 或 .cmd 文件;如果是 PowerShell 脚本,选择 .ps1 文件),然后点击 “确定”。
  4. 条件:根据需要设置任务执行的条件,如只有在计算机空闲时执行等。
  5. 设置:根据需要设置任务的其他选项,如如果任务失败是否重试等。
复制代码

  • 保存使命
  1. 完成上述设置后,点击 “确定” 保存任务。下次到每周一设定的时间时,系统会自动执行该任务。
  2. 通过以上步骤,你可以分别在 Linux 和 Windows 系统中将脚本设置为每周一执行。
复制代码
三、注意事项

   脚本功能概述
文件处理脚本:查找 /opt/oracle_mnt 目次下最新的 .DMP 文件,查抄是否已处理过。若未处理,记载文件名,修改文件权限为 777,将文件复制到 oracle11g_ee Docker 容器内的 /opt/oracle_mnt 目次,并在容器内实行 runImpdp.sh 脚本。
数据同步脚本:/path/to/dateDmp.sh 脚本在特定定时使命触发时实行,功能可能与数据同步相关,实行效果会记载到日记文件。
    定时使命设置
Linux 的 crontab:通过 crontab 可设置使命定时实行。如 00 19 * * 6 /bin/bash /path/to/dateDmp.sh >> /opt/oracle_mnt/bdcdateDmp.log 表示每周六 19:00 实行 /path/to/dateDmp.sh 脚本,并将标准输出追加到 /opt/oracle_mnt/bdcdateDmp.log 文件;
    脚本实行条件
文件处理脚本:要实行 runImpdp.sh,需满足找到未处理的 .DMP 文件、chmod 操作成功、docker cp 操作成功,以及容器运行正常、脚本存在且有实行权限等条件。
数据同步脚本:需要 /path/to/dateDmp.sh 脚本存在且有实行权限,实行用户对日记文件地点目次有写入权限。
注意事项
权限问题:确保脚本、文件及目次有合适的读写和实行权限,如 .sh 脚本需有实行权限,日记文件地点目次需有写入权限。
环境变量:crontab 使命的环境变量与交互式 shell 不同,若脚本依靠特定环境变量,需在脚本中显式设置。
错误处理:现有设置多只处理标准输出,可利用 2>&1 将标准错误输出也重定向到日记文件,方便排盘问题。还可添加错误处理代码增强脚本结实性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表