最近碰到一个Sybase ASE 12.5数据库迁移到SQL Server的需求,因此接触到这个20年前的数据库。经过一些折腾,发现除开老掉牙的工具链,还是可以利用现代工具降维打击一下这个老数据库的,在这里记录一下!
0x00 安装
数据库本身安装在一个Windows Server 2003 R2的虚拟机上,安装过程在网络上有很多,也很简单,点下一步就好,在此不再赘述。我个人习惯在创建数据库服务的时候将master设备调大些,给个500MB左右。毕竟都2025年了,和20年前比磁盘空间好像不要钱一样地便宜,而且设备太小的话,数据量大了就容易频繁爆日志,很麻烦。
要用上点现代的东西,我还在Windows 11系统上运行了安装程序,安装了Connectivity分类下的内容。这步不需要装数据库服务了,一会连接到虚拟机里的数据库。
0x01 使用pyodbc
1. 数据源配置
首先进行ODBC数据源的配置。我尝试了直接用连接字符串连接数据库,但是总是连不上,最后还是用DSN文件的形式先把数据源配置好再连接了。打开32位的这个ODBC数据源(注意不要用64位的,Sybase的ODBC驱动只有32位版本,64位的面板看不到驱动)。
添加一个系统DSN数据源,驱动程序选择Sybase ASE ODBC Driver,弹出下面的页面:
- 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:
点击属性,这次没有DSN能用,位置栏也不能填写,不过没关系。
点到“所有”页签,找到Server Name一栏,双击,输入服务器IP(我这里输入了虚拟机主机名):
回到“连接”页签,输入用户名和密码。此时点击使用初始目录栏的下拉按钮,可以发现数据库列表加载出来了,说明已经连上了。
不过如果真的要迁移到SQL Server,我更建议先迁移到SQL Server 2000,那个版本的企业管理器里的DTS对这种老数据库更友好。我也尝试了SSMS 2008的DTS,表太多的时候Sybase ASE会爆连接数,可能这也是老一辈程序员节约资源的智慧吧。
0x03 结语
感谢Windows,感谢ODBC,开放标准万岁!