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

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

