MYSQL和Sqlserver是两种常用的关系型数据库,因业务架构调整、多系统数据互通等需求,经常需要将MYSQL中的业务数据同步到Sqlserver数据库中。目前主流的同步方案可以分为三类,分别是基于数据库链接的中间件方案、自定义脚本同步方案以及第三方工具同步方案,不同方案的实现逻辑和适用场景各有不同。

基于ODBC链接的MYSQL同步Sqlserver方案
Sqlserver本身支持通过链接服务器的方式访问外部数据源,我们可以配置ODBC链接到MYSQL数据库,直接在Sqlserver中执行查询和写入操作完成数据同步。这种方案不需要额外安装第三方工具,适合对实时性要求不高的小批量数据同步场景。
配置步骤
- 在Sqlserver所在服务器安装MYSQL ODBC驱动,选择对应系统位数的驱动版本
- 打开Sqlserver Management Studio,依次展开服务器对象、链接服务器、新建链接服务器
- 在常规页填写链接服务器名称,选择其他数据源,提供程序选择Microsoft OLE DB Provider for ODBC Drivers,产品名称填写MYSQL,数据源填写之前配置的ODBC数据源名称
- 在安全页选择使用此安全上下文进行连接,填写MYSQL的用户名和密码,点击确定完成链接配置
同步示例代码
配置完成后可以通过以下SQL语句将MYSQL的用户表数据同步到Sqlserver的对应表中:
-- 先清空Sqlserver目标表数据,根据需求可选择是否执行 TRUNCATE TABLE dbo.sqlserver_user_table; -- 从MYSQL链接服务器查询数据插入到Sqlserver表中 INSERT INTO dbo.sqlserver_user_table (user_id, user_name, create_time) SELECT user_id, user_name, create_time FROM OPENQUERY(MYSQL_LINK_SERVER, 'SELECT user_id, user_name, create_time FROM mysql_user_table');
自定义脚本同步方案
如果需要更灵活的同步逻辑,比如增量同步、数据清洗后再同步,可以使用Python脚本实现。通过Python的pymysql库连接MYSQL读取数据,再通过pymssql库连接Sqlserver写入数据,适合中大型数据量的同步场景,也支持定时任务触发同步。
环境准备
需要提前安装两个Python依赖库:
pip install pymysql pymssql
同步脚本示例
以下脚本实现了从MYSQL读取用户表数据,增量同步到Sqlserver的功能,同步时会对比Sqlserver中已有的最大user_id,只同步新增数据:
import pymysql
import pymssql
# MYSQL数据库配置
mysql_config = {
"host": "127.0.0.1",
"port": 3306,
"user": "root",
"password": "your_mysql_password",
"database": "test_db",
"charset": "utf8mb4"
}
# Sqlserver数据库配置
sqlserver_config = {
"host": "127.0.0.1",
"port": 1433,
"user": "sa",
"password": "your_sqlserver_password",
"database": "test_db",
"charset": "utf8"
}
def sync_mysql_to_sqlserver():
# 连接MYSQL数据库
mysql_conn = pymysql.connect(**mysql_config)
mysql_cursor = mysql_conn.cursor()
# 连接Sqlserver数据库
sqlserver_conn = pymssql.connect(**sqlserver_config)
sqlserver_cursor = sqlserver_conn.cursor()
# 查询Sqlserver中已有的最大user_id,用于增量同步
sqlserver_cursor.execute("SELECT MAX(user_id) FROM dbo.sqlserver_user_table")
max_id_result = sqlserver_cursor.fetchone()
max_id = max_id_result[0] if max_id_result[0] else 0
# 从MYSQL查询大于max_id的新增数据
mysql_cursor.execute(f"SELECT user_id, user_name, create_time FROM mysql_user_table WHERE user_id > {max_id}")
new_data = mysql_cursor.fetchall()
if not new_data:
print("没有新增数据需要同步")
return
# 批量插入Sqlserver
insert_sql = "INSERT INTO dbo.sqlserver_user_table (user_id, user_name, create_time) VALUES (%s, %s, %s)"
sqlserver_cursor.executemany(insert_sql, new_data)
sqlserver_conn.commit()
print(f"成功同步{len(new_data)}条数据")
# 关闭连接
mysql_cursor.close()
mysql_conn.close()
sqlserver_cursor.close()
sqlserver_conn.close()
if __name__ == "__main__":
sync_mysql_to_sqlserver()
第三方工具同步方案
如果需要可视化配置、支持全量加增量同步、同步过程监控等功能,可以使用第三方数据同步工具,比如DataX、Kettle等。这类工具不需要编写大量代码,通过简单的配置即可完成同步任务,适合非开发人员操作使用。
DataX同步配置示例
DataX是阿里开源的数据同步工具,支持多种数据源之间的数据同步,以下是MYSQL同步到Sqlserver的job配置文件示例:
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "your_mysql_password",
"column": ["user_id", "user_name", "create_time"],
"connection": [
{
"table": ["mysql_user_table"],
"jdbcUrl": ["jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=utf8"]
}
]
}
},
"writer": {
"name": "sqlserverwriter",
"parameter": {
"username": "sa",
"password": "your_sqlserver_password",
"column": ["user_id", "user_name", "create_time"],
"connection": [
{
"table": ["sqlserver_user_table"],
"jdbcUrl": "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test_db"
}
]
}
}
}
],
"setting": {
"speed": {
"channel": 3
}
}
}
}
方案对比
三种主流同步方案的特点对比如下:
| 方案类型 | 配置难度 | 同步效率 | 适用场景 |
|---|---|---|---|
| ODBC链接方案 | 低 | 一般 | 小批量、低实时性、无代码开发需求的场景 |
| 自定义脚本方案 | 中 | 高 | 中大型数据量、需要自定义同步逻辑的场景 |
| 第三方工具方案 | 低 | 高 | 需要可视化配置、全量增量同步、同步监控的场景 |
注意事项
- 同步前需要确认MYSQL和Sqlserver中对应表的结构一致,字段类型需要做好映射,避免插入失败
- 增量同步时需要选择合适的增量字段,比如自增ID、更新时间等,保证同步数据的完整性
- 生产环境同步建议先在测试环境验证,同步过程中可以添加事务控制,避免数据不一致
- 如果数据量较大,建议分批次同步,避免单次同步占用过多数据库资源