经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
shell脚本实现数据库表增量同步的流程
来源:jb51  时间:2021/10/19 19:16:24  对本文有异议

需求:

  每天定时将 源数据库 study_plan 库的 zxxt_class 表

  增量同步到 目标数据库 axt_statistics 库的 zxxt_class 表中

前提条件:

  两个库中的 zxxt_class 表结构一致

  询问开发根据哪个字段作为增量参考,这里开发给的是id字段

流程:

  获取 axt_statistics 库的 zxxt_class 表中id字段的最大id值

  通过这个id值备份study_plan 库的 zxxt_class 表中大于此id的数据

  将数据导入

脚本:

  1. #!/bin/bash
  2. #通用变量
  3. MySql_Comm='/usr/local/mysql/bin/mysql'
  4. MySqldump_Comm='/usr/local/mysql/bin/mysqldump'
  5. DateTime=`date +%Y-%m-%d-%H:%M:%S`
  6. echo -e "\n\n${DateTime} -----脚本开始执行-----" >> /tmp/sourcedb.log
  7. #源数据库信息
  8. Source_MySql_User='root'
  9. Source_MySql_Pass='123456'
  10. Source_MySql_Port='3306'
  11. Source_MySql_DB='study_plan'
  12. Source_MySql_Table='zxxt_class'
  13. Source_Host_IP='192.168.0.100'
  14. #本机数据库信息
  15. Mysql_User='root'
  16. MySql_Pass='12345678'
  17. MySql_Port='3306'
  18. MySql_DB='axt_statistics'
  19. MySql_Table='zxxt_class'
  20. MySql_Bak_Dir="/tmp/`date +%Y-%m-%d-%H-%M`"
  21. #创建备份目录
  22. mkdir ${MySql_Bak_Dir}
  23. #备份本机表
  24. if [ -d ${MySql_Bak_Dir} ];then
  25. ${MySqldump_Comm} -u${Mysql_User} -p${MySql_Pass} -h 127.0.0.1 -P${MySql_Port} ${MySql_DB} ${MySql_Table} > ${MySql_Bak_Dir}/${MySql_DB}-${MySql_Table}.sql
  26. else
  27. echo "${DateTime} ERROR: ${MySql_Bak_Dir} 目录不存在" >> /tmp/sourcedb.log
  28. echo "${DateTime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log
  29. exit 1
  30. fi
  31. #获取本机表最大ID
  32. ${MySql_Comm} -u${Mysql_User} -p${MySql_Pass} -h 127.0.0.1 -P${MySql_Port} --compress ${MySql_DB} -e "select max(id) from ${MySql_Table}" > /tmp/tmp.txt
  33. ID_Num=`tail -1 /tmp/tmp.txt`
  34. echo $ID_Num
  35. #备份源表大于本机获取id的数据
  36. if [[ ${ID_Num} -gt 0 ]];then
  37. if [ -d ${MySql_Bak_Dir} ];then
  38. echo "${DateTime} 开始备份原主机${Source_MySql_DB} ${Source_MySql_Table} ID大于${ID_Num}的数据..." >> /tmp/sourcedb.log
  39. ${MySqldump_Comm} -t -u${Source_MySql_User} -p${Source_MySql_Pass} -h${Source_Host_IP} -P${Source_MySql_Port} --single-transaction --compress ${Source_MySql_DB} ${Source_MySql_Table} --where="id > '`tail -1 /tmp/tmp.txt`'" > ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql
  40. echo "${DateTime} 数据备份完成 ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql" >> /tmp/sourcedb.log
  41. #导入数据
  42. if [ -f ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql ];then
  43. echo "${DateTime} 开始导入数据..." >> /tmp/sourcedb.log
  44. ${MySql_Comm} -u${Mysql_User} -p${MySql_Pass} -h 127.0.0.1 -P${MySql_Port} ${MySql_DB} -e "source ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql"
  45. echo "${DateTime} 数据导入完成${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql..." >> /tmp/sourcedb.log
  46. echo "${DateTime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log
  47. else
  48. echo "${DateTime} ERROR: sql文件${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql不存在!"
  49. echo "${DateTime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log
  50. exit 1
  51. fi
  52. else
  53. echo "${DateTime} ERROR: ${MySql_Bak_Dir} 目录不存在" >> /tmp/sourcedb.log
  54. echo "${DateTime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log
  55. exit 1
  56. fi
  57. else
  58. echo "${DateTime} ERROR: ID 等于 NULL" >> /tmp/sourcedb.log
  59. echo "${DateTime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log
  60. exit 1
  61. fi

注意!脚本中需要注意的是,从源库中使用mysqldump时必须加参数 -t ,-t 表示备份插入数据,如果不加 -t ,那么导入到目标库的数据将替换源有数据。 

测试:

 

上面两图可以看到,源表中比目标表多了一个数据

执行脚本后

 

数据已同步过来

日志:

再看看导入的sql脚本

 可

以看到只备份并导入了自己新加的那一条数据

到此这篇关于shell脚本实现数据库表增量同步的文章就介绍到这了,更多相关shell数据库表增量同步内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号