dm达梦数据库之间全部表增量同步脚本


print('\033[0:32m达梦模式之间全部表同步脚本开始执行\033[m')
import jaydebeapi
import time
from datetime import date

start_time = time.time()  # 记录开始时间
#目标库
url = 'jdbc:dm://ip:5236/目标库模式名称'
user = '账号'
password = '密码'
dirver = 'dm.jdbc.driver.DmDriver'
jarFile = 'D:\software\dbeaver\JAVA_Mybatis\lib\DmJdbcDriver18.jar'
#源库
urls = 'jdbc:dm://ip:5236/源库模式名称'
users = '账号'
passwords = '密码'
source_mode='源库模式名称'
target_end_mode='目标库模式名称'

dm_conn =jaydebeapi.connect(dirver, url, [user, password], jarFile)
dm_cursor = dm_conn.cursor()
source_dm_conn=jaydebeapi.connect(dirver, urls, [users, passwords], jarFile)
source_dm_cursor=source_dm_conn.cursor()
# 获取达梦数据库所有表名
#dm_cursor.execute(f"select OWNER,TABLE_NAME from ALL_CONSTRAINTS WHERE OWNER='{source_mode}'")
#dm_cursor.execute(f"SELECT TABLE_NAME FROM USER_TAB_COMMENTS")
source_dm_cursor.execute(f"select DISTINCT TABLE_NAME,OWNER from ALL_CONSTRAINTS WHERE OWNER='{source_mode}' and TABLE_NAME IN ('custom_card','dim_act_type')")
tables = source_dm_cursor.fetchall()
#获取表注释
source_dm_cursor.execute(f"SELECT OWNER,TABLE_NAME,COMMENTS FROM ALL_TAB_COMMENTS WHERE OWNER='{source_mode}'")
table_chinses=source_dm_cursor.fetchall()
# 遍历所有表,增量更新到达梦
for table in tables:
    #print(table[0])
    table_name = table[0]
    target_table_name=table[0].upper()
    #print(table_name)
    # 获取表结构
    source_dm_cursor.execute(f"SELECT * FROM {source_mode}.{table_name} WHERE 1=0")
    dm_columns = [column[0].upper() for column in source_dm_cursor.description]
    for table_note in table_chinses:
        if table_note[1]==table[0]:
            table_note_result=table_note[2]

    #print(dm_columns)
    #print(dm_columns)
    # 检查是否有时间字段
    has_time_field = False
    for column in dm_columns:
        if 'TIME' in column.upper() or 'DATE' in column.upper():
            has_time_field = True
            if column.isupper():
                update_time = column.upper()

            else:

                update_time = column.lower()



            #print(update_time)
            break
    if has_time_field:
        dm_cursor.execute(f"SELECT max({update_time}) FROM {target_end_mode}.{target_table_name}")
        result = dm_cursor.fetchall()
        for i in result:
            if i[0] is None:
                source_dm_cursor.execute(f"SELECT * FROM {source_mode}.{table_name}")
            else:
                #print(i[0])
                dm_cursor.execute(f"SELECT max({update_time}) FROM {target_end_mode}.{target_table_name}")
                for k in dm_cursor.fetchall():
                    source_dm_cursor.execute(f"SELECT * FROM {source_mode}.{table_name} WHERE {update_time} >'{k[0]}'")
                    #print(source_dm_cursor.fetchall())
                #dm_cursor.execute(f"SELECT * FROM {source_mode}.{table_name} WHERE {update_time} > (SELECT max({update_time}) FROM {target_end_mode}.{table_name})")
    else:

                dm_cursor.execute(f"delete from {target_end_mode}.{target_table_name}")
                source_dm_cursor.execute(f"SELECT * FROM {source_mode}.{table_name}")





    data=source_dm_cursor.fetchall()
   # print(data)
    # 插入数据到达梦表
    insert_sql = f"INSERT INTO {target_end_mode}.{target_table_name} ({', '.join(dm_columns)}) VALUES ({', '.join([':' + str(i) for i in range(1, len(dm_columns) + 1)])})"
    dm_cursor.executemany(insert_sql, data)
    #dm_cursor.execute(insert_sql, data)
    dm_conn.commit()
    print(f'\033[0:32m{table_note_result}:{table_name}-表数据插入完成,总共:{len(data)}条数据\033[m')

# 关闭连接
dm_cursor.close()
dm_conn.close()
source_dm_cursor.close()
source_dm_conn.close()
end_time = time.time()  # 记录结束时间
execution_time = end_time - start_time  # 计算执行时长
today = date.today()



def convert_seconds(seconds):
    days = seconds // (24 * 3600)
    seconds %= (24 * 3600)
    hours = seconds // 3600
    seconds %= 3600
    minutes = seconds // 60
    seconds %= 60
    return f"{days}天 {hours}小时 {minutes}分钟 {seconds}秒"
print(f"当前日期是:{today},脚本执行时长:{convert_seconds(int(execution_time))}")


  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 达梦数据库和MySQL数据库可以使用如下方法进行增量同步: 1. 使用数据库内置的复制功能:达梦数据库提供了多种复制方式,包括基于SQL语句的复制、基于数据文件的复制、基于日志文件的复制等。这些复制方式可以在不停机的情况下进行数据库的增量同步。 2. 使用第三方的数据库同步工具:市面上有很多专门用于数据库增量同步的工具,如Navicat、Ora2pg等,这些工具可以跨越不同数据库类型之间进行数据库同步。 3. 使用编程语言进行数据库同步:可以使用编程语言,如Java、Python等,通过数据库的API来实现数据库的增量同步。 无论使用哪种方式,都需要确保数据的一致性,在同步过程中应避免数据的丢失或冲突。 ### 回答2: 达梦数据库与MySQL数据库可以通过使用数据同步工具来实现增量同步。 首先,需要安装并配置好数据同步工具。常用的数据同步工具有Maxwell、Canal等。这些工具可以监听MySQL数据库的binlog,并实时将变更数据写入到达梦数据库中。 其次,需要在达梦数据库中创建与MySQL数据库相同的结构。可以通过使用DDL语句在达梦数据库中创建,并保持和MySQL数据库中的结构一致。 然后,需要配置数据同步工具的参数,确保工具能够正确地连接到MySQL数据库和达梦数据库。配置参数包括MySQL和达梦数据库的连接地址、用户名、密码等。 最后,启动数据同步工具,它会监听MySQL数据库的binlog,并将变更数据实时写入到达梦数据库中。当MySQL数据库中有数据变更时,数据同步工具会自动将变更同步达梦数据库中,实现增量同步的功能。 在实际应用中,可以根据需求设置同步的粒度和同步的频率。可以选择全量同步增量同步的方式,以及定时或实时同步的频率,以满足具体业务需求。 需要注意的是,在进行数据同步前,需要确保达梦数据库中没有与MySQL数据库冲突的数据。此外,在数据同步过程中,需要保证源数据库和目标数据库的一致性,以避免数据不一致的问题。 总之,通过以上步骤和配置,就可以实现达梦数据库与MySQL数据库的增量同步。 ### 回答3: 达梦数据库与MySQL数据库之间增量同步可以通过数据复制的方式实现。以下是一个基本的步骤: 1. 配置MySQL数据库:首先,在MySQL数据库中创建一个具有复制权限的用户,并分配适当的权限。添加以下参数到MySQL配置文件(my.cnf)中,启用二进制日志记录: ``` log-bin=mysql-bin binlog-format=ROW server-id=1 ``` 2. 配置达梦数据库:在达梦数据库的配置文件(dm.ini)中启用增量日志功能,并指定需要同步: ``` [INCREMENTAL LOG] ENABLED=TRUE TABLES=table1, table2, ... ``` 3. 安装数据同步工具:下载并安装MySQL到达梦数据库的数据同步工具,如Data Sync工具。 4. 配置数据同步工具:在数据同步工具中,设置源数据库为MySQL,目标数据库为达梦数据库。指定需要同步和字段映射关系,并启用增量同步选项。 5. 初始化同步:使用数据同步工具执行初始同步操作,将MySQL数据库中的数据复制到达梦数据库。 6. 启动增量同步:在数据同步工具中启动增量同步功能。这将监视MySQL数据库的二进制日志并捕捉变更,然后将其应用到达梦数据库中。 需要注意的是,达梦数据库和MySQL数据库之间增量同步可能会面临一些挑战,例如数据类型转换、主键冲突等问题。确保在同步过程中进行适当的数据验证和测试,并根据具体情况调整配置和映射关系,以确保数据的准确性和完整性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值