将 sqlserver 转 postgresql ,用 pgloader 的笔记
1. 环境初始化(WSL2 Ubuntu 22.04)
bash
# 换国内源(可选)
sudo sed -i 's@http://.*.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y
# 装依赖
sudo apt install -y freetds-bin freetds-dev libsqlite3-dev gawk make g++ curl git
2. 安装 pgloader
bash
# 最快方案
sudo apt install -y pgloader
pgloader --version # ≥3.6.2 即可
3. 验证 FreeTDS 能连 SQL Server
bash
# 脱敏变量,自行替换
export MSSQL_HOST='<SQL_SERVER_IP>'
export MSSQL_PORT='1433'
export MSSQL_USER='<USER>'
export MSSQL_PASS='<PASSWORD>'
export MSSQL_DB='<DATABASE>'
tsql -H $MSSQL_HOST -p $MSSQL_PORT -U $MSSQL_USER -P $MSSQL_PASS -D $MSSQL_DB
看到 1> 表示连通,输入 exit 退出。
4. 迁移脚本(脱敏版)
文件:migrate.load
lisp
LOAD DATABASE
FROM mssql://<USER>:<PASSWORD>@<SQL_SERVER_IP>:1433/<DATABASE>
INTO postgresql://<PG_USER>:<PG_PASSWORD>@<PG_HOST>:5432/<PG_DATABASE>
WITH include drop, create tables, create indexes, reset sequences
ALTER SCHEMA 'dbo' RENAME TO 'central';
5. 跑!
bash
pgloader migrate.load
进度实时刷,出错看 /tmp/pgloader/*.log。
6. 翻车急救表
| 报错 | 一键排查 |
|---|---|
unknown reason |
`ldd $(which pgloader) |
Login failed |
检查混合模式 & 密码 |
| 时间字段全 NULL | 加 CAST type datetime to timestamp |
| 大表超时 | WITH batch rows = 10000, prefetch rows = 10000 |
7. 迁移后三板斧
sql
VACUUM ANALYZE central.*;
GRANT USAGE ON SCHEMA central TO <APP_ROLE>;
GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA central TO <APP_ROLE>;
8. 收尾
WSL 里一条命令即可把 SQL Server 整个 schema 搬进 PostgreSQL,记得
"先让 tsql 通,再让 pgloader 飞"。