一、需求背景
朋友的公司需要每天定时从源端定时同步一部分数据到目标端,库中存在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. 利用VS2015自带的报表制作报表

    我用的是VSEnterprise2015 注意:如果要用VS自带的报表,就需要在安装Microsoft SQL Server Data Tools 下面讲讲具体步骤: 1.添加winform界面 2. ...

  2. STM32F4X 关于MDK上虚拟串口调试

    1. 下载安装VSPD 自行百度安装后,利用VSPD将PC上的两个虚拟串口连接起来.如图我将COM1 和COM2连接起来. a. 点击Addr pair. 可以看到Virtual ports上将两个虚 ...

  3. <随便写> 多线程的例子

    ''' 一个线程在使用这个共享的时候,其他线程必须等待他结束 通过"锁"实现,作用就是防止多个线程使用这片内存空间 进程:程序的一次执行 线程:cpu运算的基本调度单位 多线程:大 ...

  4. 扩展kmp板子

    using namespace std; #include <cstdio> #include <cstring> #include <algorithm> #de ...

  5. HDU - 6128

    题意略: 题解:二次剩余板子题 //#pragma GCC optimize(2) //#pragma GCC optimize(3) //#pragma GCC optimize(4) //#pra ...

  6. 标准方程法_岭回归_LASSO算法_弹性网

    程序所用文件:https://files.cnblogs.com/files/henuliulei/%E5%9B%9E%E5%BD%92%E5%88%86%E7%B1%BB%E6%95%B0%E6%8 ...

  7. mysql order by排序查询速度问题

    SELECT * FROM `assets_message` LEFT JOIN purchase_message ON assets_message.purchase_id = purchase_m ...

  8. 深入浅出 Java Concurrency (24): 并发容器 part 9 双向队列集合 Deque[转]

    有一段时间没有更新了.接着上节继续吧. Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque.这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂.下图描 ...

  9. VS2010-MFC(对话框:设置对话框控件的Tab顺序)

    转自:http://www.jizhuomi.com/software/158.html 上一讲为“计算”按钮添加了消息处理函数后,加法计算器已经能够进行浮点数的加法运算.但是还有个遗留的小问题,就是 ...

  10. python3-常用模块之re

    正则表达式 定义: 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 是一种独立的规 ...