您好、欢迎来到现金彩票网!
当前位置:21点 > 自同步密码 >

基于Python的SQL Server数据库实现对象同步轻量级解析

发布时间:2019-07-04 03:58 来源:未知 编辑:admin

  本篇文章小编给大家分享一下基于Python的SQL Server数据库实现对象同步轻量级解析,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。

  日常工作中经常遇到类似的问题:把某个服务器上的某些指定的表同步到另外一台服务器。

  类似需求用SSIS或者其他ETL工作很容易实现,比如用SSIS的话,就会会存在相当一部分反复的手工操作。

  建源的数据库信息,目标的数据库信息,如果是多个表,需要一个一个地拉source和target,然后一个一个地mapping,然后运行实现数据同步。

  然后很可能,这个workflow使用也就这么一次,就寿终正寝了,却一样要浪费时间去做这个ETL。

  于是在想,可不可能快速实现类似需求,尽最大程度减少重复的手工操作?类似基于命令行的方式,简单快捷,不需要太多的手动操作。

  于是就有了本文,基于Python(目的是顺便熟悉一下Python的语法),快速实现SQL Server的数据库之间的数据同步操作,后面又稍微扩展了一下,可以实现不同服务器的数据库之间的表结构,表对应的数据,存储过程,函数,用户自定义类型表(user define table type)的同步

  目前支持在两个SQL Server数据源之间:每次同步一张或者多张表/存储过程,也可以同步整个数据库的所有表/存储过程(以及表/存储过程依赖的其他数据库对象)。

  需要考虑到一些基本的校验问题:在源服务器上,需要同步的对象是否存在,或者输入的对象是否存在于源服务器的数据库里。

  1,表的存在依赖于schema,需要考虑到表的schema是否存在,如果不存在先在target库上创建表对应的schema

  1,类似于表,需要考虑存储过程的schema是否存在,如果不存在先在target库上创建表对应的schema

  2,类似于表,arget数据库中是否已经存在对应的存储过程,是否以覆盖的方式执行

  3,存储过程可能依赖于b表,某些函数,用户自定义表变量等等,同步存储过程的时候需要先同步依赖的对象,这一点比较复杂,实现过程中遇到在很多很多的坑

  这一点导致了重构大量的代码,一开始都是直来直去的同步,无法实现这个逻辑,切实体会到代码的“单一职责”原则

  1,源服务器信息 (服务器地址,实例名,数据库名称,用户名,密码),没有用户名密码的情况下,使用windows身份认证模式

  2,目标服务器信息(服务器地址,实例名,数据库名称,用户名,密码),没有用户名密码的情况下,使用windows身份认证模式

  其实在同步数据的时候,也可以把需要同步的行数提取出来做参数,比较简单,这里暂时没有做。

  比如需要快速搭建一个测试环境,需要同步所有的表结构和每个表的一部分数据即可。

  表同步的原理是,创建目标表,遍历源数据的表,生成insert into values(***),(***),(***)格式的sql,然后插入目标数据库,这里大概步骤如下:

  2,强制覆盖的情况下,会drop掉目标表(如果存在的话),防止目标表与源表结构不一致,非强制覆盖的情况下,如果字段不一致,则抛出异常

  3,同步表结构,包括字段,索引,约束等等,但是无法支持外键,刻意去掉了外键,想想为什么?因吹斯汀。

  4,需要筛选出来非计算列字段,insert语句只能是非计算列字段(又导致重构了部分代码)

  5,转义处理,在拼凑SQL的时候,需要进行转义处理,否则会导致SQL语句错误,目前处理了字符串中的字符,二进制字段,时间字段的转义处理(最容易发生问题的地方)

  使用如下参数,同步源数据库的三张表到目标数据库,因为这里是在本机命名实例下测试,因此实例名和端口号输入

  1,如果输入obj_type=tab 且-obj=为None的情况下,会同步源数据库中的所有表。

  2,这个效率取决于机器性能和网络传输,本机测试的线次,也就是每秒钟可以提交3000~4000行左右的数据。

  1,当表的索引为filter index的时候,无法生成包含where条件的索引创建语句,那个看起来蛋疼的表结构导出语句,暂时没时间改它。

  存储过程同步的原理是,在源数据库上生成创建存储过程的语句,然后写入目标库,这里大概步骤如下:

  1,存储过程依赖于schema,所以同步存储过程之前先同步schema(同表)

  2,同步的过程会检查依赖对象,如果依赖其他对象,暂停当前对象同步,先同步依赖对象

  4,对于存储过程的同步,如果是强制覆盖的话,强制覆盖仅仅对存储过程自己生效(删除&重建),对依赖对象并不生效,如果依赖对象不存在,就创建,否则不做任何事情

  使用如下参数,同步源数据库的两个存储过程到目标数据库,因为这里是在本机命名实例下测试,因此实例名和端口号输入

  因此,这个测试的[dbo].[sp_test01]就依赖于其他对象,如果其依赖的对象不存在,同步的时候,仅仅同步这个存储过程本身,是没有意义的

  同步某一个对象的依赖对象,使用如下SQL查出来对象依赖信息,因此这里就层层深入,同步依赖对象。

  这里就类似于同步A的时候,A依赖于B和C,然后停止同步A,先同步B和C,同步B或者C的时候,可能又依赖于其他对象,然后继续先同步其依赖对象。

  如果输入obj_type=sp 且-obj=为None的情况下,会同步源数据库中的所有存储过程以及其依赖对象

  1,加密的存储过程或者函数是无法实现同步的,因为无法生成创建对象的脚本 1,table type的同步也是一个蛋疼的过程,目前支持,但是支持的并不好,原因是创建table type之前,先删除依赖于table type的对象,否则无法删除与创建。

  这一点导致在代码中层层深入,进行了长时间的debug,完全没有想到这个函数是这个鸟样子,因为这里找到依赖对象的类型,却找不到对象本身,次奥!!! 另外一种情况就是动态SQL了,无法使用 sys.dm_sql_referenced_entities这个系统函数找到其依赖的对象。

  支持其他数据库对象的同步,比如function,table type等,因为可以在同步其他存储过程对象的时候附带的同步function,table type,这个与表或者存储过程类似,不做过多说明。

  1,代码结构优化,更加清晰和条例的结构(一开始用最直接简单粗暴的方式快速实现,后面重构了很多代码,现在自己看起来还有很多不舒服的痕迹)

  2,数据同步的效率问题,对于多表的导入导出操作,依赖于单线程,多个大表导出串行的话,可能存在效率上的瓶颈,如何根据表的数据量,尽可能平均地分配多多个线,更加友好清晰的异常提示以及日志记录,生成导出日志信息。

  代码端午节写好了,这几天抽空进行了一些测试以及bug fix,应该还潜在不少未知的bug,工作量比想象中的大的多了去了。

  《街机弹珠台》又是一款弹珠游戏,这款游戏的画面将更加炫丽,它集合了多种弹珠游戏,和各种经典...

  《无限少女》是一款日系的二次元同人卡牌手游。游戏界面美轮美奂,玩法模式设计新颖,玩家可以见...

  《永远的7日之都》是一款网易制作与发行的日系动作RPG手游,有着庞大的故事观,诸多拥有不同实力...

  《寒灵之剑》是2014年首款线D的回合制手游,此款游戏汲取经典回合制游戏精髓,复原了回合制游戏...

http://hitomisiri.com/zitongbumima/243.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有