Sybase ASE 12.5数据库连接记录
最近碰到一个Sybase ASE 12.5数据库迁移到SQL Server的需求,因此接触到这个20年前的数据库。经过一些折腾,发现还是可以利用现代工具降维打击一下这个老数据库的,在这里记录一下!
direwolf
2025-09-05 0

最近碰到一个Sybase ASE 12.5数据库迁移到SQL Server的需求,因此接触到这个20年前的数据库。经过一些折腾,发现除开老掉牙的工具链,还是可以利用现代工具降维打击一下这个老数据库的,在这里记录一下!

0x00 安装

数据库本身安装在一个Windows Server 2003 R2的虚拟机上,安装过程在网络上有很多,也很简单,点下一步就好,在此不再赘述。我个人习惯在创建数据库服务的时候将master设备调大些,给个500MB左右。毕竟都2025年了,和20年前比磁盘空间好像不要钱一样地便宜,而且设备太小的话,数据量大了就容易频繁爆日志,很麻烦。

要用上点现代的东西,我还在Windows 11系统上运行了安装程序,安装了Connectivity分类下的内容。这步不需要装数据库服务了,一会连接到虚拟机里的数据库。

2025-09-05T06:16:43.png

0x01 使用pyodbc

1. 数据源配置

首先进行ODBC数据源的配置。我尝试了直接用连接字符串连接数据库,但是总是连不上,最后还是用DSN文件的形式先把数据源配置好再连接了。打开32位的这个ODBC数据源(注意不要用64位的,Sybase的ODBC驱动只有32位版本,64位的面板看不到驱动)。

Snipaste_2025-09-05_14-46-24.png

添加一个系统DSN数据源,驱动程序选择Sybase ASE ODBC Driver,弹出下面的页面:

2025-09-05T06:59:34.png

  • Data Source Name也就是DSN,后续需要通过这个名称连接到数据库,可以随便写
  • Network Library Name选择Winsock
  • Network Address数据库地址,为IP,端口的格式
  • Database Name数据库名称,填写需要连接到的数据库名称

填写这些字段后点一下Test Connect,输入用户名和密码,如果能连上说明成功了。

2. 连接!

下面就简单了,请出我们的老熟人pyodbc,这里我简单写了个执行SQL并把结果parse成对象的脚本:

import pyodbc
from pathlib import Path
from model import Table, SQLTemplate


class Table:
    def __init__(self, table_name: str, user_name: str) -> None:
        self.table_name = table_name
        self.user_name = user_name

    def __str__(self) -> str:
        return f"{self.user_name}.{self.table_name}"


def get_syb_tables() -> list[Table]:
    with open("./sql/get_tables.sql", "r", encoding="gbk") as sql_f:
        sql = sql_f.read()

    with pyodbc.connect("DSN=syb;DB=cwbase3;UID=sa;PWD=;") as cnxn:
        cur = cnxn.cursor()
        cur.execute(sql)
        result = cur.fetchall()
        cur.close()

    result = list(map(lambda x: Table(*x), result))

    return result


if __name__ == "__main__":
    tables = get_syb_tables()
    for each in tables:
        print(each)

对应的SQL:

SELECT
    sysobjects.name AS table_name,
    sysusers.name AS user_name
FROM
    sysobjects
    LEFT JOIN sysusers ON sysusers.uid = sysobjects.uid
WHERE
    type = 'U'
ORDER BY
    user_name, table_name

还挺爽的,连这种老掉牙数据库还能写有type hint的现代Python,哈哈。

0x02 使用DTS

其实这段是写这篇文章的时候想到的。既然ODBC能连,用SSMS的DTS迁移数据理论上也是可以的。不过我的环境上,SSMS 20的DTS里面只能读取到OLE DB驱动,ODBC数据源里又没有OLE DB驱动,有点奇怪。不过这并不意味着DTS的使用不可行,只是这次的配置界面可能没那么人性化而已。

首先选择Sybase ASE OLE DB Provider:

2025-09-05T06:54:11.png

点击属性,这次没有DSN能用,位置栏也不能填写,不过没关系。

2025-09-05T07:26:34.png

点到“所有”页签,找到Server Name一栏,双击,输入服务器IP(我这里输入了虚拟机主机名):

2025-09-05T07:28:22.png

回到“连接”页签,输入用户名和密码。此时点击使用初始目录栏的下拉按钮,可以发现数据库列表加载出来了,说明已经连上了。

2025-09-05T07:31:40.png

不过如果真的要迁移到SQL Server,我更建议先迁移到SQL Server 2000,那个版本的企业管理器里的DTS对这种老数据库更友好。我也尝试了SSMS 2008的DTS,表太多的时候Sybase ASE会爆连接数,可能这也是老一辈程序员节约资源的智慧吧。

0x03 结语

感谢Windows,感谢ODBC,开放标准万岁!

评论 0
没有评论
评论已关闭
发表评论
评论 取消回复
Copyright © 2025 .direwolf