Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion .github/workflows/cross-platform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,23 @@ jobs:
docker pull postgres:16-alpine
python3 tests/Run-MySqlLogicalMigration.py "$RUNNER_TEMP/mysqlpunk-logical-$GITHUB_RUN_ID-$GITHUB_RUN_ATTEMPT"

- name: Verify packet limits and actual owned process termination
if: matrix.live_tests == true
run: python3 tests/Run-MySqlLogicalMigration.py "$RUNNER_TEMP/mysqlpunk-logical-boundaries-$GITHUB_RUN_ID-$GITHUB_RUN_ATTEMPT" boundaries

- name: Verify MySQL 8.0 to 8.4 and MariaDB 10.11 to 11.4 both directions
if: matrix.live_tests == true
run: |
docker pull mysql:8.0
docker pull mariadb:10.11
python3 tests/Run-MySqlLogicalMigration.py "$RUNNER_TEMP/mysqlpunk-logical-versions-$GITHUB_RUN_ID-$GITHUB_RUN_ATTEMPT" versions

- name: Preserve synthetic logical migration evidence
if: always() && matrix.live_tests == true
uses: actions/upload-artifact@v4
with:
name: mysql-logical-migration-evidence
path: ${{ runner.temp }}/mysqlpunk-logical-${{ github.run_id }}-${{ github.run_attempt }}/
path: ${{ runner.temp }}/mysqlpunk-logical*-${{ github.run_id }}-${{ github.run_attempt }}/
if-no-files-found: ignore

- name: Build self-contained installable archives
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
## [Unreleased]

### 🚀 新增功能
- **MySQL/MariaDB 同引擎新舊版邏輯搬移**:開放 MySQL Community 8.0 ↔ 8.4、MariaDB 官方 binary 10.11 ↔ 11.4 的既有 BIGINT/LONGTEXT/LONGBLOB、整數主鍵及普通索引子集。核對完整版本與引擎標記,保留 MySQL 固定 PRIMARY 和表內索引名稱;仍用專屬 staging、內容校驗及單次發布,不允許 MySQL ↔ MariaDB 或未知 fork。版本選項與預覽一致,發版繼續暫停。
- **MySQL/MariaDB ↔ PostgreSQL 受控邏輯搬移**:加入 signed BIGINT、LONGTEXT NO PAD binary/text C、LONGBLOB/bytea、整數單欄/複合主鍵與具名普通索引。MySQL 8.4/MariaDB 11.4 目標用本輪 staging、分批 DML 交易、schema/SHA256 校驗後單次 RENAME 發布並再次驗證,不假稱 DDL 可完整回滾。失敗/取消列出殘留物件,發布結果不明禁止盲重試,不自動刪除。其他型別、文字前綴鍵、自訂 PK 名稱與相依物件明確拒絕;仍不是任意引擎/版本無損搬移,發版繼續暫停。
- **邏輯搬移的文字、主鍵與索引子集**:SQLite STRICT ↔ PostgreSQL 保留有效 UTF-8 TEXT(BINARY/C)、明確非自增單欄/複合主鍵、普通升冪索引與欄位順序。預覽包含索引 DDL,來源變更失效、取消、缺索引或內容不符仍整批回滾;FK、其他定序、default、identity、特殊索引依舊預檢拒絕,不宣稱所有跨引擎組合完成。
- **可驗證邏輯搬移的第一階段**:SQL Server 專用相容工具加入受限雙向跨版本;Avalonia 新增 SQLite STRICT ↔ PostgreSQL 的整數/二進位搬移,預覽來源/目標版本、schema/data 轉換與阻擋原因,確認後才寫入另建空目標。單一交易、分批、內容校驗與不確定狀態禁止重試,不將一般資料傳輸或原生備份宣稱為無限制跨版本/跨引擎還原。
Expand Down Expand Up @@ -55,6 +56,7 @@
- **Linux/macOS SSH Tunnel**:跨平台連線設定可勾選「透過 SSH Tunnel 連線」,填入 SSH 主機、port、使用者、密碼或 OpenSSH/PEM 私鑰(含密語)與必填的主機金鑰 SHA256 指紋;連線時以 SSH.NET 建立只綁定 127.0.0.1 動態 port 的本機轉送,MySQL/MariaDB、PostgreSQL、SQL Server 的所有查詢與資料表操作都改走轉送端點,session 中斷或程式關閉時一併關閉;SSH 連線被跳板機中斷(閒置逾時、重啟、網路中斷)後,下一次資料庫操作會以同樣的指紋規則自動重建轉送,而不是把死掉的端點交給驅動程式。主機金鑰與指紋完全比對、不符即中止並回報伺服器實際指紋;MD5 或格式錯誤的指紋、缺主機/使用者/指紋、非絕對路徑私鑰、私鑰權限過寬與 MySQL/PostgreSQL 的 VerifyFull(127.0.0.1 主機名稱必定不符)一律 fail closed,SQL Server 則改以原始主機名稱驗證憑證。SSH 密碼與私鑰密語不寫入 `connections.json`(設定檔含這兩個欄位會拒絕載入),勾選系統密碼庫時與資料庫密碼一樣以獨立項目存入 Linux Secret Service/macOS Keychain,否則只保留到本次程式關閉;smoke test 會以本機臨時 sshd 實機驗證金鑰登入、加密私鑰、錯誤密語、指紋不符、權限過寬與 provider session 整合,實機矩陣另會經 tunnel 對 MySQL 8/MariaDB 11.4(Required)、PostgreSQL 16(VerifyCA+CA)與 SQL Server 2022(Mandatory+伺服器憑證,以原始主機名稱驗證)實際查詢與列出資料庫。

### 🛠️ 問題修正與優化
- 將 MySQL/MariaDB 的 8 MiB 分批、64 KiB 單列前置拒絕與 staging/寫入中/發布後真正子程序終止納入正式 Core harness,避免只以小資料或注入例外判斷封包與 crash 行為。
- PostgreSQL 邏輯搬移保留並校驗主鍵 constraint/索引名稱;跨 SQLite 無法保留的自訂名稱與 PostgreSQL 目標名稱碰撞改在預檢阻擋,避免已驗證卻靜默更名。
- **PostgreSQL 索引鍵預檢**:讀取實際 block_size,標準 8 KiB page 下逐列檢查 PK 與普通索引的保守 2048-byte tuple 預算,包含 UTF-8、複合鍵與對齊成本。超限在確認前拒絕,不依賴壓縮或等 INSERT 才失敗;未索引文字仍保留原欄位限額。
- **SQL Server 搬移參數**:TimeSpan 不再被 DbType.Time 轉成 DateTime,NULL time 明確保留 SQL time;binary 欄位的 NULL 不再推導成 nvarchar。每批資料參數改為 2098,保留 RPC 額度。新增正式來源 SQL Server 2019 ↔ 2022 隔離雙向回歸與末批失敗/安全重試測試,不宣稱 PK/FK/index/identity 搬移或所有版本已驗證。
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ Windows 完整版介面支援繁體中文與英文;資料庫密碼、SSH 密

未發版的可驗證邏輯搬移:Windows SQL Server 專用工具支援 2016–2025 受限雙向跨版本;Avalonia「邏輯搬移」提供 SQLite STRICT ↔ PostgreSQL 的 INTEGER/bigint、BLOB/bytea、UTF-8 TEXT(BINARY/C)、非自增單欄/複合主鍵及普通升冪索引子集,使用單一交易與結構/內容校驗。

另已加入 MySQL 8.4/MariaDB 11.4 ↔ PostgreSQL 的 signed BIGINT、LONGBLOB/bytea、LONGTEXT utf8mb4 NO PAD binary/text C 子集,主鍵與普通索引只允許整數欄。MySQL 目標先建立本輪專屬 staging、交易分批寫入/校驗,再單次 RENAME 發布並重新校驗;DDL 隱含提交,失敗可能留下 staging,發布結果不明時禁止盲重試,不自動刪除或聲稱完整回滾。
另已加入 MySQL Community 8.0/8.4、MariaDB 官方 binary 10.11/11.4 ↔ PostgreSQL,以及 MySQL 8.0 ↔ 8.4、MariaDB 10.11 ↔ 11.4 同引擎新舊版的 signed BIGINT、LONGBLOB/bytea、LONGTEXT utf8mb4 NO PAD binary/text C 子集,主鍵與普通索引只允許整數欄。MySQL 目標先建立本輪專屬 staging、交易分批寫入/校驗,再單次 RENAME 發布並重新校驗;DDL 隱含提交,失敗可能留下 staging,發布結果不明時禁止盲重試,不自動刪除或聲稱完整回滾。

所有路徑只接受另建空目標與明確確認;FK、default、identity、其他定序、時間與未忠實轉換的功能在預檢阻擋。PG 自訂主鍵名稱往 MySQL、MySQL 配對的文字/binary 索引鍵等限制另見矩陣。實機證據限 PG16.15 ↔ MySQL8.4.11/MariaDB11.4.13、PG17.10 ↔ 14.24/16.15 及各自的合成 fixture,不代表全部版本或 schema。其他 MySQL/MariaDB 配對與 SQL Server 跨引擎轉換仍未開放,不宣稱整體完成或任意引擎/版本的原生 restore;版本與發布維持 hold。支援方向與實機/mock 證據區分見 [搬移矩陣](docs/LOGICAL_MIGRATION_MATRIX.md)。
所有路徑只接受另建空目標與明確確認;FK、default、identity、其他定序、時間與未忠實轉換的功能在預檢阻擋。PG 自訂主鍵名稱往 MySQL、MySQL 配對的文字/binary 索引鍵等限制另見矩陣。實機證據限 PG16.15 ↔ MySQL8.4.11/MariaDB11.4.13、MySQL8.0.46 ↔ 8.4.11、MariaDB10.11.19 ↔ 11.4.13、PG17.10 ↔ 14.24/16.15 及各自的合成 fixture,不代表全部版本或 schema。MySQL ↔ MariaDB、其他 MySQL/MariaDB 配對與 SQL Server 跨引擎轉換仍未開放,不宣稱整體完成或任意引擎/版本的原生 restore;版本與發布維持 hold。支援方向與實機/mock 證據區分見 [搬移矩陣](docs/LOGICAL_MIGRATION_MATRIX.md)。

目前的 `v1.0.0.22` GitHub Release 同時提供 Windows x64 完整版 setup、self-contained Linux x64/ARM64 安裝壓縮檔,以及 macOS Intel/Apple Silicon `.app.zip`。Linux 壓縮檔內附使用者層級的 `install.sh`/`uninstall.sh`;macOS 預覽目前採 ad-hoc 簽署、尚未 Apple notarize。每個跨平台資產都有獨立 `.sha256` 可驗證完整性。完整變更請見 `CHANGELOG.md`。

Expand Down
6 changes: 6 additions & 0 deletions docs/FEATURE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@

## 未完成功能與已知限制

- **MySQL/MariaDB 同引擎新舊版搬移(受控子集)**
- MySQL Community 8.0.x/8.4.x、MariaDB 官方 binary 10.11.x/11.4.x 同家族搬移沿用來源鎖定、完整 catalog/DDL 檢查、byte-aware batching、專屬 staging、schema/SHA256 校驗與單次 RENAME;沒有把 DDL 隱含提交改稱完整交易回滾。
- 實際 8.0.46 ↔ 8.4.11、10.11.19 ↔ 11.4.13 各 1007 列+空表,含整數複合 PRIMARY、nullable bigint 普通索引、UTF8/emoji/NULL/空 text/binary 及 Int64 極值;正式 harness 另測 stale source 在 DDL 前拒絕、殘留阻止重試、跨家族拒絕與表內重複索引名稱。不是所有 patch/型別/schema 的證明。
- UI MySQL 8.x 明列僅 8.0/8.4,預覽完整實際版本;MariaDB 10.11/11.4 分別選取。API 另核對 VERSION 與 version_comment,拒絕未知 fork,不只相信 protocol handshake 的版本前綴。
- `Run-MySqlLogicalMigration.py` 的 versions/boundaries 模式連結正式 Core,保存映像 digest、來源 hash、版本與自有容器清理證據。boundaries 以真 Process.Kill 測 staging/未提交 batch/published,並驗證 8 MiB 多批、64 KiB 前置拒絕;不是 engine crash/power loss。Windows LocalDB 匯出 integration 本輪未在 Linux 執行,歷史 crash 記錄不當本輪重跑。完整方向/限制見 `docs/LOGICAL_MIGRATION_MATRIX.md`;release hold 不變。

- **Windows 更新流程**
- 下載只接受 Windows x64 可攜包或安裝檔;SHA-256 可來自 GitHub asset digest 或舊版 manifest,缺少有效校驗碼就停止。檔案先下載到獨立暫存檔,驗證通過才取代既有下載;取消、網路錯誤與校驗失敗都會清理暫存檔。
- 靜默安裝明確指定目前程式目錄與使用者層級,支援空白、中文及單引號路徑。兩種更新腳本都等待目前程式結束,兩分鐘逾時後直接停止;安裝成功或失敗都嘗試重新啟動現有程式,並傳回安裝結果。
Expand Down
Loading
Loading