一、測試環(huán)境
1、操作系統(tǒng):
CentOS操作系統(tǒng)官方下載地址:https://www.centos.org/download/?
(Tips:目前官方版本已經到8、9)
2、DataBase版本:
根據(jù)操作系統(tǒng)下載匹配的數(shù)據(jù)庫版本和JDBC驅動包。
官方下載地址:https://opengauss.org/zh/download/??(Tips:官方最新版本3.1.0)
3、JDK版本:
登錄網(wǎng)址:https://www.oracle.com/java/technologies/downloads/#java11?
選擇對應jdk版本下載。(Tips:可在Windows下載完成后,通過FTP或者SSH到發(fā)送到Linux上)。
4、本實驗預置環(huán)境
1)操作系統(tǒng)版本:CentOS 7 64位(CentOS Linux release 7.6.1810)
2)DataBase?&?JDBC版本:
üopenGauss 2.0.1。??
üJDBC驅動版本:JDBC_2.0.0
3)JDK版本:Java 11.0.17
二、Linux環(huán)境安裝Java環(huán)境及配置步驟
1、登錄到Linux環(huán)境,切換到root用戶(Tips:需要root密碼)
?
su root
?
2、在usr目錄下建立java安裝目錄
?
cd /usr mkdir java
?
3、將“jdk-11.0.17_linux-x64_bin.tar.gz” 上傳到?/usr/java/ 目錄?。(Tips:可通過FTP或者SSH 發(fā)送到Linux系統(tǒng),在通過cp命令進行復制)
4、解壓jdk到當前目錄,得到文件夾“jdk-11.0.17”(Tips:下載不同版本的JDK文件名不同)。
?
cd /usr/java/ tar -zxvf jdk-11.0.17_linux-x64_bin.tar.gz
?
5、安裝完畢可以建立一個鏈接以節(jié)省目錄長度
?
ln -s /usr/java/jdk-11.0.17 /usr/jdk
?
6、編輯配置文件,配置環(huán)境變量
?
vi /etc/profile
?
在文本的末尾添加如下內容:
?
export JAVA_HOME=/usr/jdk export CLASSPATH=$JAVA_HOME/lib/ export PATH=$PATH:$JAVA_HOME/bin export PATH JAVA_HOME CLASSPATH cat /etc/profile
?
7、重啟機器或執(zhí)行命令
?
source /etc/profile ?
?
或???
?
sudo shutdown -r now
?
8、查看安裝情況
?
java -version
?
9、可能出現(xiàn)的錯誤信息:
?
bash: ./java: cannot execute binary file
?
出現(xiàn)這個錯誤的原因可能是在32位的操作系統(tǒng)上安裝了64位的jdk,
1、查看jdk版本和Linux版本位數(shù)是否一致。
2、查看你安裝的Ubuntu是32位還是64位系統(tǒng):
?
sudo uname -m i686 //表示是32位 x86_64 // 表示是64位
?
到此,?Java環(huán)境配置完成。
三、準備鏈接數(shù)據(jù)庫的環(huán)境
1、修改數(shù)據(jù)庫的pg_hba.conf文件。
在GS_HOME中查找pg_hba.conf文件,本實驗中數(shù)據(jù)庫GS_HOME設置的為/gaussdb/data/db1,實際操作中GS_HOME地址可以查看安裝時的配置文件
“/soft/openGauss/clusterconfig.xml”中的
?
cd /gaussdb/data/db1 vi pg_hba.conf
?
將以下內容添加進pg_hba.conf文件中。(Tips:當在鏈接時如果提示“FATAL: Forbid remote connection with trust method!”,則需要更改目標IP對應的 客戶端接入認證 將 trust 改成sha256)。
切換omm用戶登陸,使用gs_ctl命令將策略生效。
?
su - omm gs_ctl reload -D /gaussdb/data/db1
?
2、連接數(shù)據(jù)庫后,進入SQL命令界面。創(chuàng)建測試用戶dbuser,密碼為Gauss#3demo 。
?
gsql -d postgres -p 26000 -r CREATE USER dbuser IDENTIFIED BY 'Gauss#3demo'; postgres=# alter role dbuser createrole createdb; ALTER ROLE postgres=# q
?
3、創(chuàng)建測試數(shù)據(jù)庫demo。
使用gsql工具登陸數(shù)據(jù)庫。登錄用戶為dbuser,密碼為Gauss#3demo(或者為用戶自定義的密碼)。
?
gsql -d postgres -p 26000 -U dbuser –r
?
創(chuàng)建數(shù)據(jù)庫demo
?
create database demo ENCODING 'UTF8' template = template0; connect demo;
?
4、創(chuàng)建名為demo的schema,并設置demo為當前的schema。
?
CREATE SCHEMA demo;
?
將默認搜索路徑設為demo。
?
SET search_path TO demo;
?
5、創(chuàng)建測試表websites。
?
CREATE TABLE websites ( id int NOT NULL, name char(20) NOT NULL DEFAULT '', url varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (id) ); COMMENT ON COLUMN websites.name IS '站點名稱';
?
6、插入數(shù)據(jù)。
?
INSERT INTO websites VALUES ('1', 'openGauss', 'https://opengauss.org/zh/'), ('2', 'huaweicloud', 'https://www.huaweicloud.com/'), ('3', 'openEuler', 'https://openeuler.org/zh/');
?
7、退出數(shù)據(jù)庫
?
postgres=# q
?
8、修改數(shù)據(jù)庫監(jiān)聽地址。
在GS_HOME中,本實驗中數(shù)據(jù)庫GS_HOME設置的為/gaussdb/data/db1。
?
cd /gaussdb/data/db1 vi postgresql.conf
?
將listen_addresses的值修改成為*。
?
listen_addresses = '*'
?
修改完成后重啟數(shù)據(jù)庫生效(-D后面的數(shù)據(jù)庫默認路徑,需要根據(jù)實際情況進行修改)。
?
gs_ctl restart -D /gaussdb/data/db1
?
9、將對應的JDBC驅動包?“postgresql.jar” 上傳到?/soft ?目錄?。(Tips:可通過FTP或者SSH 發(fā)送到Linux系統(tǒng),在通過cp命令進行復制)。
到此,?鏈接數(shù)據(jù)庫的環(huán)境準備就緒。
四、鏈接測試
1、連接openGauss并執(zhí)行java代碼
1)使用Java程序連接數(shù)據(jù)庫并進行查詢。在/soft目錄中創(chuàng)建openGaussDemo.java文件:
?
vi /soft/openGaussDemo.java
?
進入編輯openGaussDemo.java文件模式:
?
i
?
將如下文件內容拷貝至openGaussDemo.java文件。
?
import java.sql.*; public class openGaussDemo { static final String JDBC_DRIVER = "org.postgresql.Driver"; static final String DB_URL = "jdbc//192.168.52.3:26000/demo"; // 數(shù)據(jù)庫的用戶名與密碼,需要根據(jù)自己的設置 static final String USER = "dbuser"; static final String PASS = "Gauss#3demo"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try{ // 注冊 JDBC 驅動 Class.forName(JDBC_DRIVER); // 打開鏈接 System.out.println("連接數(shù)據(jù)庫..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); // 執(zhí)行查詢 System.out.println(" 實例化Statement對象..."); stmt = conn.createStatement(); String sql; sql = "SELECT id, name, url FROM demo.websites"; ResultSet rs = stmt.executeQuery(sql); // 展開結果集數(shù)據(jù)庫 while(rs.next()){ // 通過字段檢索 int id = rs.getInt("id"); String name = rs.getString("name"); String url = rs.getString("url"); // 輸出數(shù)據(jù) System.out.print("ID: " + id); System.out.print(", 站點名稱: " + name); System.out.print(", 站點 URL: " + url); System.out.print(" "); } // 完成后關閉 rs.close(); stmt.close(); conn.close(); }catch(SQLException se){ // 處理 JDBC 錯誤 se.printStackTrace(); }catch(Exception e){ // 處理 Class.forName 錯誤 e.printStackTrace(); }finally{ // 關閉資源 try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ }// 什么都不做 try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } } System.out.println("Goodbye!"); } }
?
編輯完成后,按“ESC”鍵,輸入:wq!保存退出。
說明:請用戶根據(jù)實際情況替換紅字內容,修改
jdbc//192.168.52.3:26000/postgres中的IP信息,以及連接數(shù)據(jù)庫的用戶及密碼USER = "dbuser"、 PASS = "Gauss#3demo" 。
2、在安裝Java的本機,對Java程序編譯后執(zhí)行。
先對Java程序進行編譯(進入Java程序的目錄)
?
javac -encoding utf-8 -cp /soft/postgresql.jar openGaussDemo.java
?
再執(zhí)行以下命令(Tips:注意“.:”的書寫)。
?
java -cp .:/soft/postgresql.jar openGaussDemo
?
3、執(zhí)行結果
至此,在linux環(huán)境下java訪問openGauss數(shù)據(jù)庫就算完成了。
五、經驗小結(FAQ)
1、數(shù)據(jù)庫運行環(huán)境建議
1)支持的硬件平臺
openGauss支持運行在ARM服務器和通用的x86服務器上:
支持ARM服務器和基于x86_64的通用PC服務器。
2)支持的操作系統(tǒng)
ARM:openEuler 20.03LTS(推薦采用此操作系統(tǒng))、麒麟V10、Asianux 7.5
X86:openEuler 20.03LTS、CentOS 7.6、Asianux 7.6
2、JDBC開發(fā)應用程序的流程
3、連接故障說明
1)gsql: could not connect to server: No route to host
此問題一般是指定了不可達的地址或者端口導致的。請檢查-h參數(shù)與-p參數(shù)是否添加正確。
2)gsql: FATAL: Invalid username/password,login denied.
此問題一般是輸入了錯誤的用戶名和密碼導致的,請聯(lián)系數(shù)據(jù)庫管理員,確認用戶名和密碼的正確性。
3)gsql: FATAL: Forbid remote connection with trust method!
數(shù)據(jù)庫由于安全問題,禁止遠程登錄時使用trust模式。這時需要修改pg_hba.conf里的連接認證信息。具體的設置信息請參見:官方《開發(fā)者指南》中“管理數(shù)據(jù)庫安全 > 客戶端接入認證 > 配置文件參考”章節(jié)。??——實驗過程中遇到此錯誤tips
說明:請不要修改pg_hba.conf中openGauss主機的相關設置,否則可能導致數(shù)據(jù)庫功能故障。建議業(yè)務應用部署在openGauss之外,而非openGauss內部。
4)The “l(fā)ibpq.so” loaded mismatch the version of gsql, please check it.
此問題是由于環(huán)境中使用的libpq.so的版本與gsql的版本不匹配導致的,請通過“l(fā)dd gsql”命令確認當前加載的libpq.so的版本,并通過修改LD_LIBRARY_PATH環(huán)境變量來加載正確的libpq.so。
5)gsql: symbol lookup error: xxx/gsql: undefined symbol: libpqVersionString
此問題是由于環(huán)境中使用的libpq.so的版本與gsql的版本不匹配導致的(也有可能是環(huán)境中存在PostgreSQL的libpq.so),請通過“l(fā)dd gsql”命令確認當前加載的libpq.so的版本,并通過修改LD_LIBRARY_PATH環(huán)境變量來加載正確的libpq.so。
6)gsql: connect to server failed: Connection timed out
Is the server running on host “xx.xxx.xxx.xxx” and accepting TCP/IP connections on port xxxx?
此問題是由于網(wǎng)絡連接故障造成。請檢查客戶端與數(shù)據(jù)庫服務器間的網(wǎng)絡連接。如果發(fā)現(xiàn)從客戶端無法PING到數(shù)據(jù)庫服務器端,則說明網(wǎng)絡連接出現(xiàn)故障。
7)gsql: FATAL: permission denied for database “postgres” ?DETAIL: User does not have CONNECT privilege.
此問題是由于用戶不具備訪問該數(shù)據(jù)庫的權限,可以使用如下方法解決。
a.使用管理員用戶dbadmin連接數(shù)據(jù)庫。
gsql -d postgres -U dbadmin -p 5432
b.賦予該用戶訪問數(shù)據(jù)庫的權限。
GRANT CONNECT ON DATABASE postgres TO user1;
8)gsql: FATAL: sorry, too many clients already,active/non-active: 197?3.
此問題是由于系統(tǒng)連接數(shù)量超過了最大連接數(shù)量。請進行會話連接數(shù)管理,釋放無用會話。
會話狀態(tài)可以在視圖PG_STAT_ACTIVITY中查看。無用會話可以使用函數(shù)pg_terminate_backend進行釋放。
select datid,pid,state from pg_stat_activity;
datid | pid | state -------+-----------------+-------- 13205 | 139834762094352 | active 13205 | 139834759993104 | idle (2 rows)
其中pid的值即為該會話的線程ID。根據(jù)線程ID結束會話。
SELECT PG_TERMINATE_BACKEND(139834759993104);
顯示類似如下信息,表示結束會話成功。
PG_TERMINATE_BACKEND ---------------------- t (1 row)
9)gsql: wait xxx.xxx.xxx.xxx:xxxx timeout expired
gsql在向數(shù)據(jù)庫發(fā)起連接的時候,會有5分鐘超時機制,如果在這個超時時間內,數(shù)據(jù)庫未能正常的對客戶端請求進行校驗和身份認證,那么gsql會退出當前會話的連接過程,并報出如上錯誤。
一般來說,此問題是由于連接時使用的-h參數(shù)及-p參數(shù)指定的連接主機及端口有誤(即錯誤信息中的xxx部分),導致通信故障;極少數(shù)情況是網(wǎng)絡故障導致。要排除此問題,請檢查數(shù)據(jù)庫的主機名及端口是否正確。
10)gsql: could not receive data from server: Connection reset by peer.
同時,檢查數(shù)據(jù)庫主節(jié)點日志中出現(xiàn)類似如下日志“ FATAL: cipher file “/data/dbnode/server.key.cipher” has group or world access”,一般是由于數(shù)據(jù)目錄或部分關鍵文件的權限被誤操作篡改導致。請參照其他正常實例下的相關文件權限,修改回來便可。
11)gsql: FATAL: GSS authentication method is not allowed because XXXX user password is not disabled.
目標數(shù)據(jù)庫主節(jié)點的pg_hba.conf里配置了當前客戶端IP使用”gss”方式來做認證,該認證算法不支持用作客戶端的身份認證,請修改到”sha256”后再試。配置方法見官網(wǎng)《開發(fā)者指南》中“管理數(shù)據(jù)庫安全 > 客戶端接入認證 > 配置文件參考”章節(jié) 。
說明:
- 請不要修改pg_hba.conf中openGauss主機的相關設置,否則可能導致數(shù)據(jù)庫功能故障。
- 建議業(yè)務應用部署在openGauss之外,而非openGauss內部。
以上歡迎大家測試、并交流!
審核編輯:湯梓紅
評論