postgresql 使用odbc_fdw鏈接 sqlserver

安裝配置odbc_fdw

1.安裝unixODBC

apt-get install unixodbc unixodbc-devlinux

2.安裝 Microsoft ODBC Driver 17 for SQL Server

curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
apt-get update
apt-get install msodbcsql17 mssql-toolsgit

若是遇到: W: GPG error: http://security.ubuntu.com trusty-security Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 40976EAF437D05B5
**解決辦法:**apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 40976EAF437D05B5github

參考:docs.microsoft.comsql

3.配置ODBC

a.配置驅動數據庫

vi /etc/odbcinst.ini
#加入如下內容:
[SQLServer17] #驅動名
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.2.so.0.1
UsageCount=1ubuntu

b.配置dsn,這一步並非必須的 後面會說到curl

vi /etc/odbc.ini
#加入如下內容:
[erp-test] #dsn 名稱
Description = erp sqlserver test
Trace = On
TraceFile = stderr
Driver = SQLServer17 #驅動名稱,需和odbcinst.ini中的名稱一致
Server = 192.168.1.123
PORT = 1433
encoding = UTF8sqlserver

4.安裝 odbc_fdw

apt-get install postgresql-server-dev-10
wget https://github.com/CartoDB/odbc_fdw/archive/0.3.0.tar.gz
make
make installpost

登陸 pg 執行:
CREATE EXTENSION odbc_fdw; #添加擴展
再執行
\dx
若是看到:

表示添加成功
參考:https://github.com/CartoDB/odbc_fdwurl


odbc_fdw的使用

#--擴展的添加是基於數據庫(database)的,即 切換數據庫就須要從新添加
CREATE EXTENSION odbc_fdw;


#-- 使用 odbc.ini 中配置的 dsn 建立server, 誰建立歸屬誰
CREATE SERVER erp_sqlserver
  FOREIGN DATA WRAPPER odbc_fdw
  OPTIONS (
	dsn 'erp-test' #--須要和odbc.ini中 dsn 名稱一致
  );
	
#--也能夠不使用 dsn ,建立 server
CREATE SERVER erp_sqlserver2
  FOREIGN DATA WRAPPER odbc_fdw
  OPTIONS (
    odbc_DRIVER 'SQLServer17',
	odbc_SERVER '192.168.1.123',
	odbc_port '1433'
  );
	
	
#--給其餘用戶授予 server 使用權限
GRANT USAGE ON FOREIGN SERVER erp_sqlserver to erp_manager; 

#--建立用戶和 server 之間的映射關係
CREATE USER MAPPING FOR erp_manager
  SERVER erp_sqlserver
  OPTIONS ( "odbc_UID" 'admin', "odbc_PWD" '123456');

#--導入外部數據庫的 schema,能夠將外部庫指定schema中的所有或部分表一次導入到 pg 中指定的schema
IMPORT FOREIGN SCHEMA dbo
	LIMIT TO (table1 ,table2)  #指定須要導入的表,可選, 默認導入全部
	FROM SERVER erp_sqlserver INTO "erp_test"
	OPTIONS (
    odbc_DATABASE 'database-83336442_Test');


#--建立外部表,能夠指定字段,以及經過 sql 過濾數據,相似於視圖
CREATE FOREIGN TABLE
  "public".test_gbk_20180916 (
    id integer,
    name varchar(255) 
  )
  SERVER erp_sqlserver
  OPTIONS (
    odbc_DATABASE 'ddrobot',
    sql_query 'select id,name from `zt`.`test_gbk_20180916`',
    sql_count 'select count(id) from `zt`.`test_gbk_20180916`'
		#--encoding 'UTF8'
  );

OPTIONS 中的參數是 fdw擴展本身定義的,因此不一樣的擴展參數也是不一樣的,odbc_fdw 的參數解釋能夠參見: https://github.com/CartoDB/odbc_fdw


遇到的問題

ERROR: length for type varchar must be at least 1 LINE 1: ...imestamp, "CallBackCount" integer, "BusinessInfo" varchar(0)
出現這個是由於個人外部 sqlserver 庫中有一些varchar字段的長度設爲0(sqlserver我不太熟,難道是sqlserver在這塊不嚴格?),這個錯誤信息提示也比較明白,就很少說了

--

SSL SYSCALL error: EOF detected
出現這個問題的緣由沒有搞清楚,這應該是一個籠統的錯誤信息,在網上看到出現這個錯誤的可能性比較多,最後個人解決辦法是 更換 sqlserver odbc driver 到版本17 ,以前「apt-get install msodbcsql」這樣安裝的版本是13

--

ERROR: Connecting to driver
出現最多的就是這個問題了,驅動沒有裝好、驅動配置有問題、外部數據庫自己的鏈接問題等都會報這個錯,排查起來很苦惱。。。

開啓 pg 日誌

修改 pg 配置文件:
vi /etc/postgresql/10/main/postgresql.conf

#開啓日誌重定向到日誌文件
logging_collector = on

#日誌目錄,可使用絕對路徑或相對路徑,使用相對路徑時則是相對於變量‘PGDATA’表明的路徑,在配置文件中搜索能夠找到該路徑  
log_directory = 'pg_log'  

#指定日誌級別
log_min_messages = warning
相關文章
相關標籤/搜索