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