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

由于未提供博客具体内容,无法生成包含关键信息的摘要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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))}")


### 达梦数据库管理工具使用指南 达梦数据库DM Database)作为一款国产数据库系统,提供了丰富的管理和开发工具以支持用户完成日常的数据库操作。以下是关于达梦数据库管理工具及其使用方法的详细介绍: #### 1. 达梦数据库管理工具概述 达梦数据库提供了一系列的管理工具,用于简化数据库的配置、监控和维护工作。主要工具包括但不限于: - **DTS(Data Transfer System)**:用于实现数据迁移和同步[^2]。 - **ISQL**:命令行工具,用于执行SQL语句和脚本文件[^3]。 - **Console(控制台)**:图形化管理工具,支持对数据库实例、空间、用户权限等进行管理[^1]。 #### 2. 启动和停止数据库服务 在Linux环境下,可以通过以下命令启动或停止达梦数据库服务: ```bash cd /data/dmdbms/dmdbms/bin ./DmService_5236 start # 启动数据库服务 ./DmService_5236 stop # 停止数据库服务 ``` 这些命令适用于后台运行的服务模式,确保数据库能够在系统重启后自动启动[^1]。 #### 3. 使用ISQL工具 ISQL是达梦数据库提供的命令行工具,用户可以通过它连接到数据库并执行SQL语句。以下是一个简单的ISQL使用示例: ```bash isql -U SYSDBA -P sysdba -H 127.0.0.1 -P 5236 ``` 上述命令中: - `-U` 指定用户名,通常为 `SYSDBA`。 - `-P` 指定密码。 - `-H` 指定数据库服务器地址。 - `-P` 指定端口号,默认为 `5236`[^3]。 #### 4. 使用Console工具 达梦数据库的Console工具是一个图形化的管理界面,支持以下功能: - 数据库实例的启动与停止。 - 用户账户和权限管理。 - 空间和存储管理。 - SQL查询和脚本执行。 要启动Console工具,可以在安装目录下找到对应的可执行文件,并通过双击或命令行启动[^1]。 #### 5. 数据迁移工具DTS DTS工具可以用于跨平台的数据迁移,例如从Oracle或其他数据库迁移到达梦数据库。其主要功能包括: - 结构迁移:包括、视图、索引等对象的定义。 - 数据迁移:支持全量和增量数据迁移。 - 脚本生成:自动生成迁移所需的SQL脚本。 以下是DTS的基本使用步骤(假设已安装并配置好DTS工具): ```bash dts migrate -s source_db -t target_db -c config_file.xml ``` 其中: - `-s` 指定源数据库。 - `-t` 指定目标数据库。 - `-c` 指定配置文件路径。 #### 6. 安装包获取与版本选择 用户可以从官方资源页面下载最新的达梦数据库安装包。根据需求选择合适的版本: - **标准版(Standard Edition)**:适合中小型企业和政府机构,提供基本的数据库管理功能。 - **企业版(Enterprise Edition)**:适用于大型企业,支持更高的并发访问和更复杂的功能。 ### 注意事项 - 在安装和使用过程中,请确保操作系统环境满足达梦数据库的要求。 - 对于生产环境,建议定期备份数据库,并测试恢复流程[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值