SQLCipher數(shù)據(jù)遷移到PostgreSql詳細(xì)教程
步驟一、安裝Docker
- Windows11 安裝Docker客戶端教程:自己百度一下。
步驟二、SQLCipher解密,轉(zhuǎn)換為Sqlite3
- 訪問官網(wǎng)進(jìn)行下載
- 使用DB Browser (SQLCipher) 客戶訪問數(shù)據(jù)庫(kù)文件后,點(diǎn)開菜單欄 “工具” --> "設(shè)置加密",密碼置空后,即可進(jìn)行解密,自動(dòng)將SQLCipher轉(zhuǎn)換為Sqlite3。
- 注意:這個(gè)解密的過(guò)程耗時(shí)比較長(zhǎng),請(qǐng)耐心等待;
步驟三、將Sqlite中的數(shù)據(jù)遷移到PostgreSql中
1. Docker安裝PostgreSql
docker run --name my_postgres \ -e POSTGRES_PASSWORD=mysecretpassword \ # 設(shè)置超級(jí)用戶密碼,務(wù)必修改 -p 5432:5432 \ # 映射主機(jī)端口 5432 到容器端口 5432 -v pgdata:/var/lib/postgresql/data \ # 使用命名卷 pgdata 持久化數(shù)據(jù) -d \ # 后臺(tái)運(yùn)行容器 postgres # 使用官方鏡像
-e POSTGRES_PASSWORD=mysecretpassword: ?務(wù)必修改?mysecretpassword為你自己設(shè)定的強(qiáng)密碼,這是默認(rèn)的超級(jí)用戶postgres的密碼。-v pgdata:/var/lib/postgresql/data: 這里的pgdata是 Docker 管理的命名卷(Named Volume)?的名稱。如果該卷不存在,Docker 會(huì)自動(dòng)創(chuàng)建它。數(shù)據(jù)會(huì)存儲(chǔ)在 Docker 的管理區(qū)域(例如/var/lib/docker/volumes/),與容器生命周期分離,從而實(shí)現(xiàn)持久化。- 使用
docker volume ls可以查看所有已創(chuàng)建的命名卷。 - 增加
--restart=unless-stopped可以自動(dòng)啟動(dòng)容器,除非手動(dòng)停止。
2. 拉取pgloader鏡像
docker pull ghcr.io/dimitri/pgloader:latest
3. 準(zhǔn)備遷移腳本 migration.load
LOAD DATABASE
FROM sqlite:////data/main_data.db
INTO postgresql://postgres:123456@host.docker.internal:5432/main
WITH include drop, create tables, create indexes, reset sequences, foreign keys,
workers = 8, concurrency = 1
ALTER SCHEMA 'main' RENAME TO 'public'
BEFORE LOAD DO
$$ create schema if not exists public; $$;?? 參數(shù)說(shuō)明?:
- ?
FROM: SQLite 源數(shù)據(jù)庫(kù)連接字符串。這里使用了sqlite:///前綴,后接文件路徑。請(qǐng)注意,即使SQLite數(shù)據(jù)庫(kù)有密碼(你連接字符串中的Password=E32CE1F29B6745F984DA86FBC0159F9F),?pgloader對(duì)SQLite的支持目前可能不直接支持通過(guò)連接字符串傳遞密碼。你可能需要先使用SQLite工具解密數(shù)據(jù)庫(kù)或?qū)ふ移渌椒ǎㄈ缗R時(shí)移除密碼)再進(jìn)行遷移。/是路徑分隔符,D:/NewData/main_data.db是你的數(shù)據(jù)庫(kù)文件路徑。 - ?
INTO: PostgreSQL 目標(biāo)數(shù)據(jù)庫(kù)連接字符串。格式為postgresql://username:password@host:port/database_name。 - ?
WITH子句:include drop: 遷移前刪除目標(biāo)數(shù)據(jù)庫(kù)中已存在的同名表(??謹(jǐn)慎使用,會(huì)清除現(xiàn)有數(shù)據(jù)!?? 如果scan_spec數(shù)據(jù)庫(kù)是新創(chuàng)建的或可清空,則使用此選項(xiàng);若需保留現(xiàn)有數(shù)據(jù),請(qǐng)移除此選項(xiàng))。create tables: 在PostgreSQL中創(chuàng)建表。create indexes: 創(chuàng)建索引。reset sequences: 重置序列(例如自增主鍵的序列)。foreign keys: 創(chuàng)建外鍵約束。workers = 8: 使用8個(gè)工作線程加速遷移(可根據(jù)CPU核心數(shù)調(diào)整)。concurrency = 1: 控制并發(fā)度。
- ?
ALTER SCHEMA: SQLite 沒有模式概念,其表通常可視為在main模式中。此命令在遷移后將模式名改為 PostgreSQL 默認(rèn)的public。 - ?
BEFORE LOAD DO: 遷移前執(zhí)行的 SQL 語(yǔ)句,這里確保public模式存在。
4. 執(zhí)行遷移
使用 Docker 運(yùn)行 pgloader并執(zhí)行遷移腳本。?注意將 /path/to/your/migration.load 替換為你實(shí)際的 migration.load文件的絕對(duì)路徑。/path/to/your/data 替換為你實(shí)際的 db 文件的所在目錄。
docker run --rm -v /path/to/your/migration.load:/migration.load -v /path/to/your/data:/data ghcr.io/dimitri/pgloader:latest pgloader /migration.load
?? 命令說(shuō)明?:
--rm: 容器退出后自動(dòng)刪除。-v /path/to/your/migration.load:/migration.load: 將宿主機(jī)上的加載腳本掛載到容器內(nèi)。-v /path/to/your/data:/data: 將包含你 SQLite 數(shù)據(jù)庫(kù)文件的目錄掛載到容器內(nèi)的/data目錄,確保容器內(nèi)的 pgloader 能訪問到/path/to/your/data/main_data.db文件(因此在.load文件中,路徑可以寫為sqlite:////data/main_data.db,但上述腳本已使用宿主機(jī)絕對(duì)路徑,此掛載是為了保證一致性)。ghcr.io/dimitri/pgloader:latest: pgloader 的 Docker 鏡像。pgloader /migration.load: 在容器內(nèi)運(yùn)行的命令,執(zhí)行遷移腳本。
步驟四、特別注意
由于 Pgloader 在將 SQLite 的 INTEGER 類型(在 SQLite 中通常用來(lái)表示布爾值,0 或 1)遷移到 PostgreSQL 時(shí),將它映射成了 PostgreSQL 的 BIT 類型,而不是 BOOLEAN 或 INTEGER。PostgreSQL 的 BIT 類型是位字符串類型,它和 INTEGER 類型無(wú)法直接進(jìn)行 = 比較。所以當(dāng)你執(zhí)行 "isdelete" = 0 時(shí),PostgreSQL 就會(huì)報(bào)錯(cuò),提示找不到一個(gè)可以比較 BIT 和 INTEGER 的操作符。報(bào)錯(cuò)信息如下:
SQL 錯(cuò)誤 [42883]: ERROR: operator does not exist: bit = integer Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
所以我們需要將數(shù)據(jù)庫(kù)中所有bit(1)類型的字段轉(zhuǎn)換成boolean類型,但是PostgreSql中這兩個(gè)類型不能直接轉(zhuǎn)換,所以要先將bit(1)先轉(zhuǎn)成 integer 再轉(zhuǎn)成 boolean。下面是一個(gè)可以完成這個(gè)任務(wù)的 PostgreSQL PL/pgSQL 代碼塊。你可以將其作為一個(gè)匿名代碼塊 (DO 語(yǔ)句) 在 psql 或任何 PostgreSQL 客戶端中運(yùn)行。
DO $$
DECLARE
rec RECORD;
table_name TEXT;
column_name TEXT;
alter_sql TEXT;
BEGIN
-- 遍歷數(shù)據(jù)庫(kù)中所有表的模式(public)
FOR rec IN
SELECT
c.table_schema,
c.table_name,
c.column_name
FROM
information_schema.columns c
WHERE
c.table_schema = 'public' -- 只在 public 模式下查找,可以根據(jù)需要更改
AND c.data_type = 'bit'
AND c.character_maximum_length = 1
LOOP
table_name := rec.table_name;
column_name := rec.column_name;
RAISE NOTICE '正在處理表: %, 列: %', table_name, column_name;
-- 構(gòu)造 ALTER TABLE 語(yǔ)句,先轉(zhuǎn)成 integer
alter_sql := format('ALTER TABLE %I.%I ALTER COLUMN %I TYPE INTEGER USING %I::integer;',
rec.table_schema, table_name, column_name, column_name);
-- 執(zhí)行 SQL
EXECUTE alter_sql;
-- 構(gòu)造 ALTER TABLE 語(yǔ)句,再轉(zhuǎn)成 boolean
alter_sql := format('ALTER TABLE %I.%I ALTER COLUMN %I TYPE BOOLEAN USING %I::boolean;',
rec.table_schema, table_name, column_name, column_name);
-- 執(zhí)行 SQL
EXECUTE alter_sql;
END LOOP;
RAISE NOTICE '所有 bit(1) 字段轉(zhuǎn)換完成。';
END $$;到此,SQLite的數(shù)據(jù)已經(jīng)全部遷移到PostgreSql啦~
到此這篇關(guān)于SQLCipher數(shù)據(jù)遷移到PostgreSql詳細(xì)攻略的文章就介紹到這了,更多相關(guān)SQLCipher數(shù)據(jù)遷移到PostgreSql內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostgreSQL用戶登錄失敗自動(dòng)鎖定的處理方案
這篇文章主要介紹了PostgreSQL用戶登錄失敗自動(dòng)鎖定的解決辦法,本文給大家分享解決方案,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Windows?環(huán)境搭建?PostgreSQL?邏輯復(fù)制高可用架構(gòu)數(shù)據(jù)庫(kù)服務(wù)
本文主要介紹Windows下搭建PostgreSQL的主從邏輯復(fù)制,關(guān)于PostgreSQl的相關(guān)運(yùn)維文章,網(wǎng)絡(luò)上大多都是?Linux?環(huán)境下的操作,鮮有在?Windows?環(huán)境下配置的教程,所以本文采用?Windows?環(huán)境作為演示系統(tǒng)來(lái)進(jìn)行?PostgreSQL?高可用數(shù)據(jù)庫(kù)服務(wù)的搭建,感興趣的朋友一起看看吧2023-05-05
PostgreSQL使用JSONB存儲(chǔ)和查詢復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
在PostgreSQL中,JSONB是一種二進(jìn)制格式的JSON數(shù)據(jù)類型,它允許你在數(shù)據(jù)庫(kù)中存儲(chǔ)和查詢復(fù)雜的JSON數(shù)據(jù)結(jié)構(gòu),本文給大家介紹了如何使用JSONB類型在PostgreSQL中存儲(chǔ)和查詢復(fù)雜的數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下2024-04-04
PostgreSQL更新表時(shí)時(shí)間戳不會(huì)自動(dòng)更新的解決方法
這篇文章主要為大家詳細(xì)介紹了PostgreSQL更新表時(shí)時(shí)間戳不會(huì)自動(dòng)更新的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
將PostgreSQL的數(shù)據(jù)實(shí)時(shí)同步到Doris的技巧分享
眾所周知,在兩個(gè)毫不相干的數(shù)據(jù)管理系統(tǒng)之間進(jìn)行數(shù)據(jù)同步,特別是實(shí)時(shí)同步,其復(fù)雜程度足以讓高級(jí)DBA腦瓜疼,本文給大家介紹了將PostgreSQL的數(shù)據(jù)實(shí)時(shí)同步到Doris的技巧分享,需要的朋友可以參考下2024-03-03
在PostgreSQL中實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)清理和過(guò)期清理
在 PostgreSQL 中,可以通過(guò)多種方式實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)清理和過(guò)期處理,以確保數(shù)據(jù)庫(kù)不會(huì)因?yàn)榇鎯?chǔ)過(guò)多過(guò)時(shí)或不再需要的數(shù)據(jù)而導(dǎo)致性能下降和存儲(chǔ)空間浪費(fèi),本文給大家介紹了一些常見的方法及詳細(xì)示例,需要的朋友可以參考下2024-07-07
PostgreSQL教程(六):函數(shù)和操作符詳解(2)
這篇文章主要介紹了PostgreSQL教程(六):函數(shù)和操作符詳解(2),本文講解了模式匹配、數(shù)據(jù)類型格式化函數(shù)、時(shí)間/日期函數(shù)和操作符等內(nèi)容,需要的朋友可以參考下2015-05-05
PostgreSQL 自增語(yǔ)法的用法說(shuō)明
這篇文章主要介紹了PostgreSQL 自增語(yǔ)法的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
PostgresSql 多表關(guān)聯(lián)刪除語(yǔ)句的操作
這篇文章主要介紹了PostgresSql 多表關(guān)聯(lián)刪除語(yǔ)句的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01

