一、需求背景
朋友的公司需要每天定时从源端定时同步一部分数据到目标端,库中存在company_id列的表,只将指定的company_id列导入到目标端数据库;存在company_id列的表,将表中所有的数据导入到目标端。
 
二、实现思路
1 远端与目标端的ip地址、账号、密码、端口号等信息保存在配置文件中,由我朋友自己填写;
2 通过information_schema.`COLUMNS`获取需要导出的表数据;
3 通过mysqldump导出表
4 通过通过mysql -e 的方式导入数据
5 预先在目标端建立相对应的schema
 
三、代码实现
3.1 配置文件db.conf
[db]
source_host=源端IP
source_port=源端端口
source_user=源端用户名
source_passwd=源端密码
dest_host=目标端用户名
dest_port=目标端端口
dest_user=目标端用户名
dest_passwd=目标端密码
3.2 实现代码
# -*- coding: utf-8 -*-
# @Time : 2019-09-11 10:25
# @Author : Huangwenjun
# @Email : 350920551@qq.com
# @File : rsyncdata.py
# @Software: PyCharm
# @exe_location:
import pymysql
import configparser
import os
class RsyncData():
def __init__(self):
self.get_item()
self.mysql_host = self.item['source_host']
self.mysql_port = int(self.item['source_port'])
self.mysql_user = self.item['source_user']
self.mysql_pwd = self.item['source_passwd']
self.dest_host=self.item['dest_host']
self.dest_port=int(self.item['dest_port'])
self.dest_user = self.item['dest_user']
self.dest_pwd = self.item['dest_passwd']
self.conn_source() def get_item(self):
"""
读取配置文件信息
"""
cf = configparser.ConfigParser()
cf.read('db.conf', encoding='utf8')
config = {}
for db in cf.sections():
items = {}
for item in cf.items(db):
items[item[0]] = item[1]
config[db] = items
self.item = config['db'] def conn_source(self):
"""
连接源端数据库
"""
self.source_conn = pymysql.connect(host=self.dest_host, port=self.dest_port, user=self.dest_user,
passwd=self.dest_pwd, charset='utf8mb4') def execute_sql(self, conn, sql):
"""
执行sql
"""
curs = conn.cursor()
curs.execute(sql)
if sql.startswith('select'):
rows = curs.fetchall()
curs.close()
return rows
else:
curs.execute('commit')
curs.close() def close(self):
"""
关闭数据库连接
"""
self.source_conn.close() def backup_table(self,table_schema,table_name,is_com):
"""
备份表
:param table_schema: 数据库schema
:param table_name: 表名称
:param is_com: 是否包含company_id
"""
if is_com>=1:
backup_cmd="mysqldump -u%s -p%s -h %s -P %s --single-transaction %s %s --where='company_id=1'>%s.sql"%(self.mysql_user,self.mysql_pwd,self.mysql_host,self.mysql_port,table_schema,table_name,table_name)
else:
backup_cmd = "mysqldump -u%s -p%s -h %s -P %s --single-transaction %s %s>%s.sql" % (
self.mysql_user, self.mysql_pwd, self.mysql_host,self.mysql_port, table_schema, table_name, table_name)
os.system(backup_cmd) def mysql_import(self,table_schema,table_name):
"""
数据导入
:param table_schema: 数据库schema
:param table_name: 表名称
"""
import_cmd='mysql -u%s -p%s -h %s -P %s -D %s -e"source %s.sql"'%(self.dest_user,self.dest_pwd,self.dest_host,self.dest_port,table_schema,table_name)
print(import_cmd)
os.system(import_cmd) def run(self):
"""
执行入口
:return:
"""
#从源端获取库 表名称
sql="select table_schema,table_name,sum(case when column_name='company_id' then 1 else 0 end) company_id_count from information_schema.`COLUMNS` where TABLE_SCHEMA not in ('mysql','information_schema','performance_schema','sys') group by table_schema,table_name"
rows=self.execute_sql(self.source_conn,sql)
for row in rows:
table_schema=row[0]
table_name=row[1]
is_comid=row[2]
#数据备份
self.backup_table(table_schema,table_name,is_comid)
#数据导入
self.mysql_import(table_schema,table_name) if __name__ == '__main__':
rsync_data=RsyncData()
rsync_data.run()
rsync_data.close()

Mysql指定部分数据同步的更多相关文章

  1. redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)

    一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录 ...

  2. canal+mysql+kafka实时数据同步安装、配置

    canal+mysql+kafka安装配置 概述 简介 canal译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 基于日志增量订阅和消费的业务包括 数 ...

  3. Mysql 主从服务器数据同步

    安装2台windows Server 服务器,分别安装Mysql,配置环境变量,完成安装确认在CMD窗口可以使用Mysql命令 在Master服务器上创建同步账号,确保Slave服务器能访问Maste ...

  4. mysql 集群 数据同步

    mysql集群配置在网站负载均衡中是必不可少的: 首先说下我个人准备的负载均衡方式: 1.通过nginx方向代理来将服务器压力分散到各个服务器上: 2.每个服务器中代码逻辑一样: 3.通过使用redi ...

  5. 转载:MySQL和Redis 数据同步解决方案整理

    from: http://blog.csdn.net/langzi7758521/article/details/52611910 最近在做一个Redis箱格信息数据同步到数据库Mysql的功能. 自 ...

  6. Mysql、ES 数据同步

    数据同步中间件 不足:不支持 ES6.X 以上.Mysql 8.X 以上 ime 标识最大时间 logstash全量.增量同步解决方案 https://www.elastic.co/cn/downlo ...

  7. Mysql和Redis数据同步策略

    为什么对缓存只删除不更新 不更新缓存是防止并发更新导致的数据不一致. 所以为了降低数据不一致的概率,不应该更新缓存,而是直接将其删除, 然后等待下次发生cache miss时再把数据库中的数据同步到缓 ...

  8. mysql 存储过程 实现数据同步

    数据库 表 发生变化,需要把2.0的表数据 同步到3.0库中去: -- 同步数据存储过程执行 -- 更新留言旧表数据到新表数据中 /*DEFINER:Vector*/ drop procedure i ...

  9. MySql触发器实现数据同步学习

    触发器实现:(增.删.改操作事件触发数据单向同步)数据库触发器教程:https://www.cnblogs.com/phpper/p/7587031.html同步代码: DELIMITER $ DRO ...

随机推荐

  1. CSS display overflow 属性 cursor光标类型

    display属性   功能:规则网页元素如何显示的问题.   取值:none(隐藏).block(以块元素显示).inline(以行内元素显示)   block:可以实现将行内元素转成块元素.   ...

  2. day 80 Vue学习一之vue初识

    Vue学习一之vue初识   本节目录 一 Vue初识 二 ES6的基本语法 三 Vue的基本用法 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 vue初识 vue称为渐进式js框架 ...

  3. 如何查找一个命令由哪个rpm安装&&rpm 的相关查询方法

    [root@test-can-nginx src]# which python3 /usr/bin/python3 [root@test-can-nginx src]# rpm -qf /usr/bi ...

  4. 初识OpenCV-Python - 004: Trackbar as the color palette

    此次学习了如何用OpenCV建立一个色调盘.其中会用到cv2.getTrackbarPos(), cv2.createTrackbar()函数. code: import cv2import nump ...

  5. Android开发 输入法调用学习

    方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Context. ...

  6. 【BZOJ3944】Sum

    题面 Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1, ...

  7. 洛谷 2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

    一道水状压,然而不知道是不是太久没做过dp了,我盯着它二十分钟才反应过来.... 还把数组开小了WA了一发QAQ //Twenty #include<algorithm> #include ...

  8. python随机数(转载)

    随机生成 0 到 1 之间的浮点数 random.random() 方法会返回 [0.0, 1.0) 之间的浮点数,注意,这是一个左闭右开的区间,随机数可能会是 0 但不可能为 1 . 随机生成 a ...

  9. js实现获取两个日期之间所有日期的方法

    function getDate(datestr){ var temp = datestr.split("-"); var date = new Date(temp[0],temp ...

  10. JEECG 4.0 版本发布,JAVA快速开发平台

    JEECG 4.0 版本发布,系统全面优化升级,更快,更稳定!         导读                               ⊙平台性能优化,系统更稳定,速度闪电般提升      ...