如何將mysql遷移到翰高數(shù)據(jù)庫(kù)
一,設(shè)置翰高數(shù)據(jù)庫(kù)可以遠(yuǎn)程訪問(wèn)
檢查數(shù)據(jù)庫(kù)服務(wù)狀態(tài)
# 檢查數(shù)據(jù)庫(kù)服務(wù)是否運(yùn)行 sudo systemctl status highgo # 如果沒(méi)有運(yùn)行,啟動(dòng)服務(wù) sudo systemctl start highgo # 檢查進(jìn)程 ps aux | grep postgres
檢查本地連接
# 先在數(shù)據(jù)庫(kù)服務(wù)器本地測(cè)試連接 psql -h localhost -p 5866 -d highgo -U jing -c "SELECT version();"
配置遠(yuǎn)程訪問(wèn)
vi /home/jing/hgdb-v9.0/data/postgresql.conf
找到并修改
listen_addresses = '*' # 允許所有IP連接 port = 5866
修改客戶端認(rèn)證
# 允許從任何IP連接 host all all 0.0.0.0/0 scram-sha-256
重啟數(shù)據(jù)庫(kù)服務(wù)器
# 重啟服務(wù) sudo systemctl restart highgo
檢查端口監(jiān)聽(tīng)
# 檢查5866端口是否在監(jiān)聽(tīng) netstat -tulpn | grep 5866 # 應(yīng)該看到類似: # tcp 0 0 0.0.0.0:5866 0.0.0.0:* LISTEN 12345/postgres
配置防火墻
# 開(kāi)放5866端口 sudo ufw allow 5866 # 或者針對(duì)特定IP開(kāi)放 sudo ufw allow from 192.168.190.154 to any port 5866 # 檢查防火墻狀態(tài) sudo ufw status
備注,如果檢查端口監(jiān)聽(tīng)時(shí),出現(xiàn)
tcp 0 127.0.0.1:5866 0.0.0.0:* LISTEN 12345/postgres
這會(huì)只能本地連接,不能遠(yuǎn)程連接。
需要再排查下原因,這是我遇到的問(wèn)題,解決方案
用root權(quán)限檢查端口監(jiān)聽(tīng)
# 用sudo檢查端口監(jiān)聽(tīng)(顯示完整信息) sudo netstat -tulpn | grep 5866 # 或者使用ss命令 sudo ss -tulpn | grep 5866
檢查數(shù)據(jù)庫(kù)日志
# 查看數(shù)據(jù)庫(kù)啟動(dòng)日志 sudo journalctl -u highgo -n 20 # 或者查看數(shù)據(jù)庫(kù)日志文件 sudo tail -f /home/jing/hgdb-v9.0/data/log/*.log
檢查是否有其他配置覆蓋
# 檢查所有配置文件中關(guān)于listen的設(shè)置 sudo grep -r "listen" /home/jing/hgdb-v9.0/data/ # 檢查是否有環(huán)境變量覆蓋 sudo grep -r "PGPORT\|PGHOST" /etc/systemd/system/
通過(guò)以上找到問(wèn)題
有兩個(gè)配置文件在沖突:
/home/jing/hgdb-v9.0/data/postgresql.conf - 設(shè)置了 listen_addresses = ‘*’
/home/jing/hgdb-v9.0/data/db.conf - 設(shè)置了 listen_addresses = ‘localhost’
db.conf 文件覆蓋了 postgresql.conf 的設(shè)置!
解決方案
# 編輯 db.conf 文件 sudo vi /home/jing/hgdb-v9.0/data/db.conf
找到并修改:
# 將 listen_addresses = 'localhost' # 改為 listen_addresses = '*'
重啟數(shù)據(jù)庫(kù)服務(wù)
# 重啟服務(wù) sudo systemctl restart highgo # 檢查狀態(tài) sudo systemctl status highgo # 檢查端口監(jiān)聽(tīng) sudo netstat -tulpn | grep 5866
應(yīng)該能看到
tcp 0 0 0.0.0.0:5866 0.0.0.0:* LISTEN xxxxx/postgres
二,進(jìn)行遷移,這里選擇從mysql遷移到翰高數(shù)據(jù)庫(kù)
方法1,使用 Navicat Premium
Navicat Premium 支持多種數(shù)據(jù)庫(kù),包括 MySQL 和 PostgreSQL(與翰高數(shù)據(jù)庫(kù)兼容),可以方便地進(jìn)行數(shù)據(jù)傳輸。
步驟
1,準(zhǔn)備環(huán)境:確保你安裝了 Navicat Premium,并且可以同時(shí)連接到源 MySQL 數(shù)據(jù)庫(kù)和目標(biāo)翰高數(shù)據(jù)庫(kù)。
2,創(chuàng)建目標(biāo)空數(shù)據(jù)庫(kù):在翰高數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)空的數(shù)據(jù)庫(kù),用于接收數(shù)據(jù)。
3,使用“數(shù)據(jù)傳輸”功能:
- 在 Navicat 中,選擇 工具 -> 數(shù)據(jù)傳輸。
- 源:選擇你的 MySQL 連接和數(shù)據(jù)庫(kù)。
- 目標(biāo):選擇你的翰高數(shù)據(jù)庫(kù)連接和剛創(chuàng)建的空數(shù)據(jù)庫(kù)。
4,配置傳輸選項(xiàng):
- “高級(jí)”選項(xiàng)卡:這是關(guān)鍵。
勾選 “遇到錯(cuò)誤時(shí)繼續(xù)”,避免因單條記錄失敗而中斷整個(gè)進(jìn)程。
在 “記錄轉(zhuǎn)換” 或類似選項(xiàng)中,可以選擇在傳輸時(shí)執(zhí)行一些簡(jiǎn)單的數(shù)據(jù)轉(zhuǎn)換。
- “選項(xiàng)”選項(xiàng)卡:可以選擇傳輸表結(jié)構(gòu)、數(shù)據(jù)、索引、約束等。建議第一次先只傳輸 “結(jié)構(gòu)”,檢查和修復(fù)問(wèn)題后,再單獨(dú)傳輸 “數(shù)據(jù)”。
5,運(yùn)行并檢查:
- 開(kāi)始傳輸。Navicat 會(huì)自動(dòng)嘗試創(chuàng)建兼容的表結(jié)構(gòu)并插入數(shù)據(jù)。
- 傳輸完成后,務(wù)必仔細(xì)檢查日志文件,查看是否有表創(chuàng)建失敗、數(shù)據(jù)類型轉(zhuǎn)換錯(cuò)誤或數(shù)據(jù)插入失敗等情況。
6,手動(dòng)修復(fù):根據(jù)日志中的錯(cuò)誤,手動(dòng)在翰高數(shù)據(jù)庫(kù)中修復(fù)不兼容的 SQL 語(yǔ)句或數(shù)據(jù)類型。

方法2:使用 SQL 文件導(dǎo)出和導(dǎo)入 (通用方法)
這是一種比較原始但可控的方法,適用于數(shù)據(jù)量不大或需要深度定制的情況。
步驟:
1,從 MySQL 導(dǎo)出結(jié)構(gòu)和數(shù)據(jù)
使用 mysqldump 工具,但最好將表結(jié)構(gòu)和數(shù)據(jù)分開(kāi)導(dǎo)出,以便于修改。
導(dǎo)出僅結(jié)構(gòu):
mysqldump -h [mysql_host] -u [user] -p --no-data [database_name] > mysql_schema.sql
導(dǎo)出僅數(shù)據(jù):
mysqldump -h [mysql_host] -u [user] -p --no-create-info [database_name] > mysql_data.sql
2,轉(zhuǎn)換 SQL 文件
這是最繁瑣但最關(guān)鍵的一步。你需要手動(dòng)或使用腳本修改 mysql_schema.sql 文件,使其符合翰高數(shù)據(jù)庫(kù)(PostgreSQL)的語(yǔ)法。
常見(jiàn)轉(zhuǎn)換項(xiàng):
反引號(hào):MySQL 使用 `,PostgreSQL 使用 " 或不使用(如果表名/字段名不是關(guān)鍵字)。
自增主鍵:
MySQL: id int AUTO_INCREMENT PRIMARY KEY
PostgreSQL: id SERIAL PRIMARY KEY 或 id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY
- 字符串類型:
LONGTEXT -> TEXT
TINYTEXT -> TEXT 或 VARCHAR
VARCHAR(255) -> VARCHAR(255) (通常不變)
- 日期時(shí)間類型:
DATETIME -> TIMESTAMP
TIMESTAMP -> TIMESTAMPTZ (建議,帶時(shí)區(qū))
- 布爾類型:
TINYINT(1) -> BOOLEAN
- 注釋語(yǔ)法:
MySQL: COMMENT 這是一個(gè)注釋
PostgreSQL: COMMENT ON COLUMN table_name.column_name IS ‘這是一個(gè)注釋’;
索引:檢查是否有特定于 MySQL 的索引類型(如 FULLTEXT),需要在翰高中找到替代方案(如 GIN 索引)。
引擎聲明:刪除 ENGINE=InnoDB 等。
3,在翰高數(shù)據(jù)庫(kù)中導(dǎo)入
使用 psql 命令行工具連接到翰高數(shù)據(jù)庫(kù)。
先導(dǎo)入修改后的結(jié)構(gòu)文件:
psql -h [highgo_host] -U [highgo_user] -d [highgo_database] -f converted_schema.sql
- 然后導(dǎo)入數(shù)據(jù)文件:
psql -h [highgo_host] -U [highgo_user] -d [highgo_database] -f mysql_data.sql
4,修復(fù)序列(自增)
數(shù)據(jù)導(dǎo)入后,表的自增序列可能沒(méi)有更新到最大值,需要手動(dòng)重置。
sql
-- 為每個(gè)有自增主鍵的表執(zhí)行以下操作(以表 your_table 和主鍵列 id 為例)
SELECT setval(pg_get_serial_sequence('your_table', 'id'), COALESCE(MAX(id), 1)) FROM your_table;
-- 或者使用一個(gè)腳本生成所有表的修復(fù)語(yǔ)句
SELECT 'SELECT setval(pg_get_serial_sequence(''' || table_name || ''', ''' || column_name || '''), COALESCE(MAX(' || column_name || '), 1)) FROM ' || table_name || ';'
FROM information_schema.columns
WHERE table_schema = 'public'
AND column_default LIKE 'nextval%';
三,遷移后的關(guān)鍵檢查和驗(yàn)證
無(wú)論使用哪種方法,遷移完成后都必須進(jìn)行驗(yàn)證:
1.數(shù)據(jù)一致性檢查:隨機(jī)抽取幾張表,對(duì)比 MySQL 和翰高數(shù)據(jù)庫(kù)中的記錄數(shù)量以及關(guān)鍵字段的值是否一致。
2.應(yīng)用程序測(cè)試:將應(yīng)用程序的連接字符串指向新的翰高數(shù)據(jù)庫(kù),進(jìn)行全面的功能測(cè)試、性能測(cè)試和壓力測(cè)試。
3.檢查存儲(chǔ)過(guò)程和函數(shù):如果 MySQL 中有存儲(chǔ)過(guò)程、函數(shù)或觸發(fā)器,它們幾乎 100% 需要重寫,因?yàn)閮烧叩恼Z(yǔ)法完全不同。這部分通常是手動(dòng)工作量最大的。
4.檢查外鍵和約束:確保所有外鍵約束、唯一約束等都正確遷移。
5.權(quán)限配置:重新配置應(yīng)用程序用戶的權(quán)限。
總結(jié)
到此這篇關(guān)于如何將mysql遷移到翰高數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)mysql遷移到翰高數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
DROP TABLE在不同數(shù)據(jù)庫(kù)中的寫法整理
這篇文章主要介紹了DROP TABLE在不同數(shù)據(jù)庫(kù)中的寫法整理的相關(guān)資料,需要的朋友可以參考下2017-04-04
Mysql根據(jù)一個(gè)表的數(shù)據(jù)更新另一個(gè)表數(shù)據(jù)的SQL寫法(三種寫法)
這篇文章主要介紹了Mysql根據(jù)一個(gè)表的數(shù)據(jù)更新另一個(gè)表數(shù)據(jù)的SQL寫法,本文給大家分享三種解決方法,需要的朋友可以參考下2023-06-06
基于sqlalchemy對(duì)mysql實(shí)現(xiàn)增刪改查操作
這篇文章主要介紹了基于sqlalchemy對(duì)mysql實(shí)現(xiàn)增刪改查操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

