CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

SQLプログラミングサイトのバグを発見!

2024-06-01 20:50:17 | SQL

SELECT EMPNO , ENAME , SAL / 0
FROM EMP
WHERE EMPNO = 7902

と特定のセル(SALカラムのEMPNO7902ロウ)を0で割るとエラー表示になると予想したのだが・・・

EMPNOENAMESAL / 0
7902FORD

結果は空欄となってしまった。




SELECT EMPNO , ENAME , SAL * 0
FROM EMP
WHERE EMPNO = 7902

は当然0と表示される。


任意のカラムのデータに数値計算や関数計算をするSQLプログラム

2024-06-01 18:50:46 | SQL

問題
従業員の給料を2%上げることにしました。EMP表から従業員名(ENAME)と1.02倍した給料(SAL)を表示してください。

答えは・・・
SELECT ENAME , SAL * 1.02
FROM EMP

天邪鬼な俺は、給料を1000分の1にしてやりたくなったwww

SELECT ENAME , SAL / 1000
FROM EMP

ENAMESAL / 1000
SMITH0.8000
ALLEN1.6000
WARD1.2500
JONES2.9750
MARTIN1.2500
BLAKE2.8500
CLARK2.4500
KING5.0000
TURNER1.5000
JAMES0.9500
FORD3.0000
MILLER1.3000

さらに平方根を表示したり、sinΘにして表示したりwww

SELECT ENAME , SQRT(SAL) , SIN(SAL)
FROM EMP
ORDER BY SAL

ENAMESQRT(SAL)SIN(SAL)
SMITH28.2842712474619020.8939696481970214
JAMES30.8220700148448830.9454647941364737
WARD35.35533905932738-0.3465363519963052
MARTIN35.35533905932738-0.3465363519963052
MILLER36.05551275463989-0.5805130081563131
TURNER38.72983346207417-0.9939019569066535
ALLEN40-0.8012247906768953
CLARK49.49747468305833-0.4279919714449212
BLAKE53.38539126015655-0.5442234412178194
JONES54.5435605731785740.08812847214728746
FORD54.7722557505166140.21918997428281808
KING70.71067811865476-0.9879664387667768



任意の条件で並び替えるSQL文

2024-06-01 17:15:04 | SQL
というSQL学習サイトを利用してみた。

サンプルデータのHIREDATEカラムの日付が新しくなる順で並べ替えてみた。
SQLプログラムは・・・

SELECT *
FROM EMP
ORDER BY HIREDATE

結果は・・・


EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
7369SMITHCLERK79021980-12-1780030020
7499ALLENSALESMAN76981981-02-20160030030
7521WARDSALESMAN76981981-02-22125050030
7566JONESMANAGER78391981-04-02297520
7698BLAKEMANAGER78391981-05-01285030
7782CLARKMANAGER78391981-06-09245010
7844TURNERSALESMAN76981981-09-081500030
7654MARTINSALESMAN76981981-09-281250140030
7839KINGPRESIDENT1981-11-17500010
7900JAMESCLERK76981981-12-0395030
7902FORDANALYST75661981-12-03300020
7934MILLERCLERK77821982-01-23130010

SELECT *
で全てのカラムを表示する。
任意のカラムのみ、例えばJOBカラムのみ表示したければ
SELECT JOB
と書けば良い。

なぜいきなりこんなSQL文をネタにしたのかというと、現在働いている現場のピット・基礎・外周部埋立の再生砂とドロコン(流動化処理土)の日付ごと、使用した工区や箇所ごとの使用体積記録を作っておけと指示されたからだ。
自分が納入時や使用時に立ち合い、記録したものは分かるが、他人が担当した時のものは調べないと分からない状態にあった。
調べていくと、日付がバラバラになって割り出された。これをEXCELに判明した時にその都度書き込んでいったら日付がバラバラになってしまった。 
いちいち並べ直していたら時間がかかるのでなんとかしたいと思ったのがきっかけだ。

ちなみにMySQLでEXCELデータを操作する方法の本を見つけたので、即ポチった。



有料のアドオンも出ていたが、そんな単純な下らないことでいちいち金を取るな!と思った。
後日、俺様がChatGPTを使ってアドオンを作ってみたい。
成功&完成の暁には、無料でソースコードを公開する。

ムラマツDN

2024-06-01 16:09:35 | 音楽・楽器
ヤフオクでかなり使い込まれたDNを入手した。約170000円。
50年前に製造されたらしい。
管体が厚く、重めで結構ズシリとくる。

使ってみたら低音・中音が全く鳴らないので、キーが歪んでいるのだろうと思い、新宿のムラマツに修理の見積もりに出したら、左手親指のHキーのタンポが虫食い状に欠けているので、これを直せば音は出せるようになると。

修理代はわずか4000円。

他のタンポはもうそろそろいい加減交換したほうが良いかも、というくらい変色してトーンホールの跡も深目についていた。 
※ムラマツの新型タンポには残念ながら対応していないとのこと。キーカップが小さいから合わないらしい。

しかし、応急処置ということで一旦、Hキータンポのみの交換で引き取ってきたのだが、恐ろしいくらいの爆音でダークで重厚な音を奏でた。

緻密というか極めて濃厚というか、表現し難い音色だ。

所々錆びてメッキが剥がれて見窄らしいが、そこまで使い込まれた理由がよく分かった。















ムラマツは抵抗感が強く、使いこなせなかったので、15年前位にPTPを手放してしまった。

今はEXとDNがあるのだが、EXはヤフオク行きになるだろう。

今ならムラマツを吹きこなせる状態になった。息圧も肺活量も十分、息の効率の良い使い方も身についた。

いずれPTPを再び手に入れたい。



プラットフォームエンジニアとは?

2024-06-01 15:39:17 | C / Visual C++
某問答サイトで秀逸な回答が出たので転載する。

アプリケーションプログラマーは何かしらのOS、SDK、フレームワーク等のシステムソフトウェアの上でプログラミングをしますが、プラットフォームソフトウェアエンジニアは、これらプラットフォーム側を開発します。

具体的には、
OSの移植
デバイスドライバーの開発
API、SDK、ライブラリー、フレームワーク等を開発します。

特にOSの移植やデバイスドライバーの開発では、ソフトウェアの知識に加えて、ハードウェアの知識とOSの知識が必要になります。

回路図を読み、それを動作させるデバイスドライバーやOSの下層部分をプログラミングして、適切にOSに組み込み、その環境をアプリケーションプログラマーに提供します。

なるほど。
じゃあ、
アスキー出版局の
WDMデバイスドライバプログラミング完全ガイド

とか

秀和システムの
作りながら学ぶ
OSカーネル
保護モードプログラミングの基本と実践

みたいな本を読んだり、Githubで関連するソースコードを漁ったりすればよいのだな?






3Dスキャナー scaniverse

2024-06-01 07:17:13 | アイデア起業・アイデア売買

Scaniverse - Apps on Google Play

Scaniverse - Apps on Google Play

Capture Life in 3D. Scan, edit, and share meshes or gaussian splats with ease.

3Dスキャナーのscaniverseを試してみた。

便所のドアノブをスキャンしてみた。

こちらは撮影した写真。

スキャンした対象物を点群データ化し、3Dレンダリングするらしいが…



















生成された3Dスキャンデータを動かしてみた所をキャプチャーしてみた。

数日前にwebの広告記事で知ったから早速インストールして試した結果はイマイチ。

やはり無料のアンドロイド用アプリに高品質を求めるのは酷だと思った。

仕事等で本格的に使いたければ、有料のPC版を使うべきなのだろう。もちろん、専用の機材でスキャンしなければならないはず。



埼玉医科大学医学部の2024年度入試結果

2024-05-26 21:38:17 | 日記
なぜかGoogleのトップページの下にこんな記事が出ていたので何処ぞの学歴詐称詐欺師への当て付けとして載せてみたwww
埼玉医科大学医学部の2024年度入試結果と2025年度入試変更点

埼玉医科大学医学部の2024年度入試結果と2025年度入試変更点

こんにちは。渋谷校の合格請負人である教務マネージャーの川村と申します。聖マリアンナ医科大学医学部の2024年度入試結果が公表されました。

医歯専門予備校 メルリックス学院

埼玉医科大学医学部の2024年度入試結果

合格最低点

一般前期


2024
2023
2022
一次合格最低点
229/400点
(57.3%)
245/400点
(61.3%)
245/400点
(61.3%)

一般後期


2024
2023
2022
一次合格最低点
278/400点
(69.5%)
251/400点
(62.3%)
243/400点
(60.8%)
思ったよりも前期は高くない。
埼玉医大は私立医大のいわゆるFラン、最底辺の一角を成しているが、性転換手術を行ったという実績がある。生意気にも昔から理科2科目を科している。

他は川崎医大(神奈川県川崎市じゃなくて岡山県www)、金沢医大(旧制六医大の金沢大医学部が間違われてかわいそう。)、愛知医大、帝京大学医学部、獨協医大。

こいつらは国試にうかる見込みのない奴は卒業させないとか国試を受けさせないとかやらかして不正に国試合格率の操作をしている。
それでも合格率は浪人も含めて70%台である。

しかし舐めてはいけない。偏差値では早慶の理工学部を凌ぐデータもあるし、合格最低点は問題の難しさの割に意外と高いので、しっかり対策していないと一次落ちの憂き目に遭うだろう。特に後期は熾烈な敗者復活戦となる。本来、旧設医大(東京医大とか東邦大医学部、久留米大医学部、北里大医学部等)に合格できるはずだったのがしくじりまくって流れてきたとか、国公立医学部との併願もある。

俺も帝京大学医学部を受けて合格したが、英語はdaily commodityの意味を日本語三文字で答えよ、とか数学は格子点の問題が出てナヌーーー???となった。
英語は自信がなく、とりあえず日用品(生活用品では四文字なので☓、消耗品はニュアンス的にふさわしくない)と解答し、数学は数え間違えた。
帝京は合格最低点が9割を記録した年度があるので、内心ビビっていた。

運動中は「時間の感覚がゆがむ」ことが明らかに、最新研究

2024-05-26 20:55:45 | 日記

運動中は「時間の感覚がゆがむ」ことが明らかに、最新研究 | Forbes JAPAN 公式サイト(フォーブス ジャパン)

運動中は「時間の感覚がゆがむ」ことが明らかに、最新研究 | Forbes JAPAN 公式サイト(フォーブス ジャパン)

運動は以前から、心身両面で健康にプラスの効果があると喧伝されてきた。だが、最近の研究で、その効果に関する知見に、興味深いもう一つの知見が加わった。運動には、人の...

時間感覚のゆがみに関しては、20年以上前から認識していた。
しかしそのような現象の示唆や研究の有無については知る由もなかった。

今日、初めてそういう研究があることを知った。

眠っている間はあっという間に時間が過ぎてしまうように感じる。
しかし、車の組み立てラインみたいに同じことを延々と繰り返すような作業をやっていると時間が止まっているように感じてしんどくて耐えられなくなる。

日本語全文検索システム、拡張機能、ツール、ライブラリ等

2024-05-26 10:28:47 | SQL
日本語全文検索システム(ライブラリ)について。


PostgreSQL用高速日本語全文検索モジュールPGroonga(ぴーじーるんが) 3.0.0リリース

PGroongaはPostgreSQLを高速に日本語全文検索可能なシステムに拡張する魔法のような拡張機能です。PGroongaの他にも類似の拡張機能はありますが、速度・機能面で他の拡張機能とは一線を画しています。

OrcleやSQL serverにもあるだろう。

PostgreSQLベースのcockroach DBにはないというのなら作るしかない。このPGroongaをいじればなんとかなるかも。
俺が勉強して作ってみたい。

リアルスピニングバードキック?www

2024-05-25 08:18:17 | 日記


コメント欄を見ると、こんなコメントが。www

「幼少期の春麗みたいだ」

このまま大人になったら、ガチでスピニングバードキックができるようになるかもwww

こちらは本家本元


リアルでガチでやった奴www


リアルでガチでやった奴その2www








SQL、DB 移行ツールflyway

2024-05-20 14:11:11 | SQL

以下のSQL、DBに対応しているらしい。

OracleDB
SQL Server
Aurora
MySQL
MariaDB,
Percona
XtraDB
Cluster
PostgreSQL
Redshift
CockroachDB
SAP HANA
Sybase ASE
Informix
H2
HSQLDB
Derby and SQLite

JAVAで作られているようだ。これは気に入らん。
C++やGoに書き換えてみたい。

3D Archi Designer 2Dの jwcadから3Dパースやウォークスルー動画まで作れる!

2024-05-19 06:18:32 | アイデア起業・アイデア売買

3D Archi Designer

3D Archi Designer

建築企画設計/意匠設計/プレゼンテーションソフト 3D Archi Designer 戸建て住宅の新築・リフォームから、ビル・マンションの内外装、商業施設・店舗設計まで幅広い建築物に...

メガソフト株式会社 -

2Dしかできないjwcadから3Dパースが作れて、しかもウォークスルー動画まで作れてしまう!
これで1年契約のサブスク版で約10万円、永久ライセンスで約30万円は安い!

もちろんAutocadにも対応している。

Revitで3Dパースを作るとかアホくさくなってしまう。


F#でAutoCADCHATBOTプログラムを書き換えてみた結果orz

2024-05-18 15:00:49 | Visual C#

C#でAutoCADCHATBOT動作確認に成功!

の記事の続編。

F#はVB.net同様、手動でのパス通しをする羽目になった。

open Autodesk.AutoCAD.Runtime
open Autodesk.AutoCAD.ApplicationServices
open Autodesk.AutoCAD.DatabaseServices
open Autodesk.AutoCAD.EditorInput
open Autodesk.AutoCAD.Geometry

type MyCommands() =
    interface IExtensionApplication with
        member this.Initialize() = 
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nMyCommands initialized")
        member this.Terminate() = 
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nMyCommands terminated")

    [<CommandMethod("bot")>]
    member this.ProcessUserInput() =
        let doc = Application.DocumentManager.MdiActiveDocument
        let ed = doc.Editor
        ed.WriteMessage("\nProcessUserInput called")

        let userInput = this.GetStringFromUserInput("CAD", "何をしましょうか?")
        if userInput.Contains("直線") then
            this.CreateLine()
        elif userInput.Contains("円") then
            this.CreateCircle()
        else
            ed.WriteMessage("\nそのような操作はできません。")

    member private this.CreateLine() =
        let doc = Application.DocumentManager.MdiActiveDocument
        let ed = doc.Editor

        let start_x = this.GetDoubleFromUserInput("始点のX座標を入力してください。")
        let start_y = this.GetDoubleFromUserInput("始点のY座標を入力してください。")
        let end_x = this.GetDoubleFromUserInput("終点のX座標を入力してください。")
        let end_y = this.GetDoubleFromUserInput("終点のY座標を入力してください。")

        this.DrawLine(start_x, start_y, end_x, end_y)

    member private this.CreateCircle() =
        let doc = Application.DocumentManager.MdiActiveDocument
        let ed = doc.Editor

        let center_x = this.GetDoubleFromUserInput("中心のX座標を入力してください。")
        let center_y = this.GetDoubleFromUserInput("中心のY座標を入力してください。")
        let radius = this.GetDoubleFromUserInput("半径を入力してください。")

        this.DrawCircle(center_x, center_y, radius)

    member private this.GetDoubleFromUserInput(prompt: string) : double =
        let ed = Application.DocumentManager.MdiActiveDocument.Editor
        let mutable result = ed.GetDouble(prompt)
        while result.Status <> PromptStatus.OK do
            ed.WriteMessage("\n数値を入力してください。")
            result <- ed.GetDouble(prompt)
        result.Value

    member private this.GetStringFromUserInput(title: string, prompt: string) : string =
        let ed = Application.DocumentManager.MdiActiveDocument.Editor
        (ed.GetString(prompt)).StringResult

    member private this.DrawLine(startX: double, startY: double, endX: double, endY: double) =
        let doc = Application.DocumentManager.MdiActiveDocument
        let db = doc.Database

        use tr = db.TransactionManager.StartTransaction()
        let bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) :?> BlockTable
        let btr = tr.GetObject(bt.[BlockTableRecord.ModelSpace], OpenMode.ForWrite) :?> BlockTableRecord

        let startPoint = Point3d(startX, startY, 0.0)
        let endPoint = Point3d(endX, endY, 0.0)
        let line = new Line(startPoint, endPoint)
        btr.AppendEntity(line) |> ignore
        tr.AddNewlyCreatedDBObject(line, true) |> ignore

        tr.Commit()

    member private this.DrawCircle(centerX: double, centerY: double, radius: double) =
        let doc = Application.DocumentManager.MdiActiveDocument
        let db = doc.Database

        use tr = db.TransactionManager.StartTransaction()
        let bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) :?> BlockTable
        let btr = tr.GetObject(bt.[BlockTableRecord.ModelSpace], OpenMode.ForWrite) :?> BlockTableRecord

        let centerPoint = Point3d(centerX, centerY, 0.0)
        let circle = new Circle(centerPoint, Vector3d.ZAxis, radius)
        btr.AppendEntity(circle) |> ignore
        tr.AddNewlyCreatedDBObject(circle, true) |> ignore

        tr.Commit()

 

ACETUCS-BUTTON

というコマンドが勝手に呼び出され、ロード中・・・と表示されたままフリーズ・

誰もACETUCS-BUTTONなんていうコマンドを入力した覚えがないんだけど。

F#は使えない言語ということでソッコー没!

次はC++でためしてみることになった。

どうなるかわからんが、とりあえずChatGPTの吐いたソースコードをここに投げておこう。

#include "acutads.h"
#include "acedads.h"
#include "acdocman.h"
#include "dbents.h"
#include "dbmain.h"
#include "dbsymtb.h"
#include "dbapserv.h"
#include "geassign.h"
#include "acarray.h"

class MyCommands
{
public:
    static void ProcessUserInput()
    {
        AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
        AcDbBlockTable* pBlockTable;
        AcDbBlockTableRecord* pBlockTableRecord;

        acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
        pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
        pBlockTable->close();

        ACHAR szPrompt[512];
        acutPrintf(_T("\nCAD、何をしましょうか?: "));
        acedGetString(0, szPrompt);
        CString userInput = szPrompt;

        if (userInput.Find(_T("直線")) != -1)
        {
            CreateLine(pBlockTableRecord);
        }
        else if (userInput.Find(_T("円")) != -1)
        {
            CreateCircle(pBlockTableRecord);
        }
        else
        {
            acutPrintf(_T("\nそのような操作はできません。"));
        }

        pBlockTableRecord->close();
    }

private:
    static void CreateLine(AcDbBlockTableRecord* pBlockTableRecord)
    {
        double start_x = GetDoubleFromUserInput(_T("始点のX座標を入力してください。"));
        double start_y = GetDoubleFromUserInput(_T("始点のY座標を入力してください。"));
        double end_x = GetDoubleFromUserInput(_T("終点のX座標を入力してください。"));
        double end_y = GetDoubleFromUserInput(_T("終点のY座標を入力してください。"));

        AcDbLine* pLine = new AcDbLine(AcGePoint3d(start_x, start_y, 0), AcGePoint3d(end_x, end_y, 0));
        pBlockTableRecord->appendAcDbEntity(pLine);
        pLine->close();
    }

    static void CreateCircle(AcDbBlockTableRecord* pBlockTableRecord)
    {
        double center_x = GetDoubleFromUserInput(_T("中心のX座標を入力してください。"));
        double center_y = GetDoubleFromUserInput(_T("中心のY座標を入力してください。"));
        double radius = GetDoubleFromUserInput(_T("半径を入力してください。"));

        AcDbCircle* pCircle = new AcDbCircle(AcGePoint3d(center_x, center_y, 0), AcGeVector3d::kZAxis, radius);
        pBlockTableRecord->appendAcDbEntity(pCircle);
        pCircle->close();
    }

    static double GetDoubleFromUserInput(const ACHAR* prompt)
    {
        double value;
        ACHAR szPrompt[512];
        acutPrintf(prompt);
        acedInitGet(0, _T("Cancel"));
        if (RTNORM != acedGetReal(szPrompt, &value))
        {
            acutPrintf(_T("\n数値を入力してください。"));
            acutPrintf(_T("\n操作をキャンセルしました。"));
            acedGetPoint(nullptr, _T("\n続行するにはリターン キーを押してください。"));
            acutPrintf(_T("\n"));
            return -1.0;
        }
        return value;
    }
};

extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
    switch (msg)
    {
    case AcRx::kInitAppMsg:
        acrxDynamicLinker->unlockApplication(pkt);
        acrxRegisterAppMDIAware(pkt);
        break;
    case AcRx::kUnloadAppMsg:
        // Do nothing
        break;
    }
    return AcRx::kRetOK;
}

extern "C" void
ProcessUserInput()
{
    MyCommands::ProcessUserInput();
}


PostgreSQL からCockroachDBへの移行について

2024-05-12 21:11:06 | SQL

PostgreSQL からの移行 (cockroachlabs.com)

から引用したものを和訳してみた。

PostgreSQL からの移行
このページでは、PostgreSQLからCockroachDBにデータを移行するための基本的な考慮事項と基本的な例を示します。このページの情報は、データベースを CockroachDB に移行するための大まかなフェーズと考慮事項について説明している「移行の概要」を読んでいることを前提としています。

このページの PostgreSQL 移行の例では、MOLT ツールを使用して PostgreSQL スキーマを更新し、データの初期読み込みを実行し、データを検証する方法を示します。これらの手順は、完全な移行の準備をするときに不可欠です。

先端:
CockroachDBへの移行についてサポートが必要な場合は、営業チームにお問い合わせください。

構文の違い
CockroachDBはPostgreSQLのワイヤプロトコルをサポートしており、PostgreSQLの構文とほぼ互換性があります。

構文の違いについては、PostgreSQLと異なる機能を参照してください。

サポートされていない機能
以下のPostgreSQL機能は、CockroachDBにはまだ存在しません。

トリガー。これらは、アプリケーション ロジックに実装する必要があります。
イベント。
主キーを削除します。

手記:
各テーブルには、主キーが関連付けられている必要があります。主キー制約は、1 つのトランザクション内で削除および追加できます。

XML 関数。

列レベルの権限。

XA 構文。

テンプレートからデータベースを作成する。

テーブルから 1 つのパーティションを削除する。

外部データラッパー。

アドバイザリ ロック関数 (ただし、一部の関数は no-op 実装で定義されています)。

PostgreSQL データの読み込み
次のいずれかの方法を使用して、PostgreSQL データを CockroachDB に移行できます。

IMPORT INTO を使用して、ユーザーファイルまたはクラウドストレージを介して保存された CSV、TSV、または Avro データを CockroachDB 上の既存のテーブルに移行します。このオプションでは、最高のスループットが得られますが、インポート速度を達成するにはテーブルをオフラインにする必要があります。

先端:
CockroachDB でのインポートパフォーマンスを最適化するためのベストプラクティスについては、「インポートパフォーマンスのベストプラクティス」を参照してください。
サードパーティのデータ移行ツール(AWS DMS、Qlik、Striimなど)を使用してデータをロードします。

PostgreSQL から移行する場合、COPY FROM を使用して、CSV またはタブ区切りのデータを CockroachDB テーブルにコピーできます。このオプションを使用すると、テーブルをオンラインのままにしてアクセス可能にすることができます。ただし、IMPORT INTOを使用するよりも遅くなります。

次の例では、を使用して初期データ・ロードを実行します。IMPORT INTO

例: CockroachDB への移行frenchtowns
次の手順では、移行中のスキーマの変換、データの初期読み込みの実行、およびデータの整合性の検証を示します。

完全移行のコンテキストでは、これらの手順により、PostgreSQL データを CockroachDB に適切に移行し、クラスターに対してアプリケーション クエリをテストできます。詳細については、「移行の概要」を参照してください。

始める前に
この例では、PostgreSQL データセットの変更バージョンを使用し、スキーマとデータをサーバーレスクラスターに移行する方法を示します。次の手順に従うには、次の手順を実行します。french-towns-communes-francais

データセットをダウンロードします。frenchtowns

   curl -O https://cockroachdb-migration-examples.s3.us-east-1.amazonaws.com/postgresql/frenchtowns/frenchtowns.sql
PostgreSQL インスタンスにデータベースを作成します。frenchtowns

   createdb frenchtowns
ダウンロードしたファイルのパスを指定して、データをPostgreSQLにロードします。frenchtowns

   psql frenchtowns -a -f frenchtowns.sql
スキーマ変換ツールへのアクセスとサーバーレスクラスターの作成に使用する無料のクラウドアカウントを作成します。

先端:
CockroachDB セルフホストデータベースに移行する場合は、変換されたスキーマをスキーマ変換ツールからエクスポートし、Cockroach SQL でステートメントを実行するか、Alembic、Flyway、Liquibase などのサードパーティのスキーマ移行ツールを使用できます。

ステップ1。PostgreSQL スキーマの変換
スキーマ変換ツールを使用して、CockroachDB との互換性のためにスキーマを変換します。スキーマには、frenchtownsregionsdepartmentstowns

次の pg_dump コマンドで PostgreSQL スキーマをダンプします。frenchtowns

   pg_dump --schema-only frenchtowns > frenchtowns_schema.sql
Cloud Console でスキーマ変換ツールを開き、新しい PostgreSQL スキーマを追加します。

変換が完了したら、結果を確認します。要約レポートには、「必要な修正」の下にエラーがあることが示されます。スキーマを CockroachDB に移行するには、これらを解決する必要があります。

先端:
また、PostgreSQL データベースの資格情報を追加して、スキーマ変換ツールが PostgreSQL データベースから直接スキーマを取得するようにすることもできます。
Missing user: postgreserrors は、SQL ユーザーが CockroachDB に存在しないことを示します。「ユーザーの追加」をクリックして、ユーザーを作成します。postgres

Miscellaneous Errorsには、安全に削除できるステートメントが含まれています。「削除」をクリックして、スキーマからステートメントを削除します。SELECT pg_catalog.set_config('search_path', '', false)

[提案] の下に一覧表示されているステートメントを確認します。Cockroach Labs では、シーケンスを使用して主キー列を定義することはお勧めしません。詳細については、「一意の ID のベスト プラクティス」を参照してください。CREATE SEQUENCE

この例では、これ以上変更を加えずに提案を承認します。実際には、CockroachDB への完全な移行を実行した後、一意の非連続主キーを使用するように CockroachDB スキーマを変更します。

[移行の再試行] をクリックします。概要レポートに、エラーがないことが表示されます。これは、スキーマを CockroachDB に移行する準備ができていることを意味します。

この例では、サーバーレスクラスターに直接移行します。 CockroachDB セルフホストデータベースに移行する場合は、変換されたスキーマをスキーマ変換ツールからエクスポートし、Cockroach SQL でステートメントを実行するか、Alembic、Flyway、Liquibase などのサードパーティのスキーマ移行ツールを使用できます。

[Migrate Schema] をクリックして、変換されたスキーマで新しいサーバーレスクラスターを作成します。データベースに という名前を付けます。frenchtowns

このデータベースは、Cloud Console の [データベース] ページで確認できます。

ステップ2。PostgreSQL データの読み込み
CSV形式のデータでIMPORT INTOを使用して、データをCockroachDBにロードします。IMPORT INTO では、次の属性を持つテーブルごとに 1 つのファイルをエクスポートする必要があります。frenchtowns

ファイルは、有効な CSV (カンマ区切り値) または TSV (タブ区切り値) 形式である必要があります。
区切り文字は 1 文字でなければなりません。区切り文字オプションを使用して、コンマ以外の文字 (TSV 形式のタブなど) を設定します。
ファイルは UTF-8 でエンコードする必要があります。
フィールドに次の文字のいずれかが含まれている場合は、フィールドを二重引用符で囲む必要があります。
区切り文字 (デフォルト)。,
二重引用符 () です。フィールドは二重引用符で囲まれるため、フィールド内の二重引用符の前に別の二重引用符を付けてエスケープします。例えば:。""aaa","b""bb","ccc"
改行 () です。\n
キャリッジリターン()。\r
カラムがバイト型の場合、有効な UTF-8 文字列、または で始まる 16 進数エンコードされたバイト リテラルのいずれかになります。たとえば、値がバイト であるフィールドは、 と記述されます。\x12\x0102
手記:
デフォルトでは、IMPORT INTO はターゲット表のすべての外部キー制約を無効にします。

PostgreSQLデータベースの各テーブルをCSV形式のファイルにダンプします。frenchtowns

   psql frenchtowns -c "COPY regions TO stdout DELIMITER ',' CSV;" > regions.csv
   psql frenchtowns -c "COPY departments TO stdout DELIMITER ',' CSV;" > departments.csv
   psql frenchtowns -c "COPY towns TO stdout DELIMITER ',' CSV;" > towns.csv
CockroachDB クラスターがアクセスできる場所でファイルをホストします。

CockroachDB クラスター内の各ノードは、インポートされるファイルにアクセスできる必要があります。クラスターがデータにアクセスする方法はいくつかあります。IMPORT INTO がプルできるストレージのタイプの詳細については、以下を参照してください。

クラウドストレージを使用する
ローカル・ファイル・サーバーの使用
Amazon S3 や Google Cloud などのクラウドストレージは、インポートするデータファイルをホストすることを強くお勧めします。

前のステップで生成されたダンプファイルは、この例用に作成されたパブリック S3 バケットですでにホストされています。

CockroachDB クラスターへの SQL シェルを開きます。コマンドを見つけるには、Cloud Console で [接続] ダイアログを開き、データベースと [CockroachDB クライアント] オプションを選択します。次のようになります。frenchtownsfrenchtowns

   cockroach sql --url "postgresql://{username}@{hostname}:{port}/frenchtowns?sslmode=verify-full" 
IMPORT INTO を使用して、各 PostgreSQL ダンプ ファイルをデータベース内の対応するテーブルにインポートします。frenchtowns

次のコマンドは、この例でデータダンプファイルがホストされているパブリック S3 バケットを指しています。frenchtowns

先端:
インポートする行数を指定するオプションを追加できます。たとえば、テーブルの最初の 10 行をインポートします。このオプションは、時間とリソースを消費するインポートを実行する前に、エラーをすばやく検出するのに役立ちます。row_limitrow_limit = '10'
   IMPORT INTO regions
     CSV DATA (
       'https://cockroachdb-migration-examples.s3.us-east-1.amazonaws.com/postgresql/frenchtowns/regions.csv'
     );
           job_id       |  status   | fraction_completed | rows | index_entries | bytes
   ---------------------+-----------+--------------------+------+---------------+--------
     893753132185026561 | succeeded |                  1 |   26 |            52 |  2338
   IMPORT INTO departments
     CSV DATA (
       'https://cockroachdb-migration-examples.s3.us-east-1.amazonaws.com/postgresql/frenchtowns/departments.csv'
     );
           job_id       |  status   | fraction_completed | rows | index_entries | bytes
   ---------------------+-----------+--------------------+------+---------------+--------
     893753147892465665 | succeeded |                  1 |  100 |           300 | 11166
   IMPORT INTO towns
     CSV DATA (
       'https://cockroachdb-migration-examples.s3.us-east-1.amazonaws.com/postgresql/frenchtowns/towns.csv'
     );
           job_id       |  status   | fraction_completed | rows  | index_entries |  bytes
   ---------------------+-----------+--------------------+-------+---------------+----------
     893753162225680385 | succeeded |                  1 | 36684 |         36684 | 2485007
ターゲット表のすべての外部キー制約が無効になることを思い出してください。と に定義されている制約を表示します。IMPORT INTOdepartmentstowns

   SHOW CONSTRAINTS FROM departments;
     table_name  |     constraint_name     | constraint_type |                         details                         | validated
   --------------+-------------------------+-----------------+---------------------------------------------------------+------------
     departments | departments_capital_key | UNIQUE          | UNIQUE (capital ASC)                                    |     t
     departments | departments_code_key    | UNIQUE          | UNIQUE (code ASC)                                       |     t
     departments | departments_name_key    | UNIQUE          | UNIQUE (name ASC)                                       |     t
     departments | departments_pkey        | PRIMARY KEY     | PRIMARY KEY (id ASC)                                    |     t
     departments | departments_region_fkey | FOREIGN KEY     | FOREIGN KEY (region) REFERENCES regions(code) NOT VALID |     f
   SHOW CONSTRAINTS FROM towns;
     table_name |      constraint_name      | constraint_type |                             details                             | validated
   -------------+---------------------------+-----------------+-----------------------------------------------------------------+------------
     towns      | towns_code_department_key | UNIQUE          | UNIQUE (code ASC, department ASC)                               |     t
     towns      | towns_department_fkey     | FOREIGN KEY     | FOREIGN KEY (department) REFERENCES departments(code) NOT VALID |     f
     towns      | towns_pkey                | PRIMARY KEY     | PRIMARY KEY (id ASC)                                            |     t
外部キーを検証するには、ALTER TABLE ...VALIDATE CONSTRAINT ステートメントを使用します。

   ALTER TABLE departments VALIDATE CONSTRAINT departments_region_fkey;
   ALTER TABLE towns VALIDATE CONSTRAINT towns_department_fkey;
ステップ3。移行されたデータを検証する
MOLT Verifyを使用して、PostgreSQLとCockroachDBのデータが一致していることを確認します。

MOLT Verifyをインストールします。

MOLT Verifyをインストールしたディレクトリで、次のコマンドを使用して2つのデータベースを比較し、PostgreSQL接続文字列を に、CockroachDB接続文字列を に指定します。--source--target

先端:
CockroachDB 接続文字列を見つけるには、Cloud Console で [接続] ダイアログを開き、データベースと [全般] 接続文字列オプションを選択します。frenchtowns
   ./molt verify --source 'postgresql://{username}:{password}@{host}:{port}/frenchtowns' --target 'postgresql://{user}:{password}@{host}:{port}/frenchtowns?sslmode=verify-full'
初期出力が表示されます。

   <nil> INF verification in progress
次の出力は、MOLT Verify が検証を完了したことを示しています。

   <nil> INF finished row verification on public.regions (shard 1/1): truth rows seen: 26, success: 26, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
   <nil> INF finished row verification on public.departments (shard 1/1): truth rows seen: 100, success: 100, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
   <nil> INF progress on public.towns (shard 1/1): truth rows seen: 10000, success: 10000, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
   <nil> INF progress on public.towns (shard 1/1): truth rows seen: 20000, success: 20000, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
   <nil> INF progress on public.towns (shard 1/1): truth rows seen: 30000, success: 30000, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
   <nil> INF finished row verification on public.towns (shard 1/1): truth rows seen: 36684, success: 36684, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
   <nil> INF verification complete
スキーマを移行し、初期データ読み込みを検証したら、実際の移行の次の手順は、完全な移行を実行する前に、必要なアプリケーションの変更を行ったことを確認し、アプリケーション クエリを検証し、ドライ ランを実行することです。

詳細については、「移行の概要」を参照してください。

 

MySQLだけじゃなくてPostgreSQLもCockroachDBへの移行ツールが無いらしいようだ。

もしかしたらOracleDBもCockroachDBへの移行ツールがないかもしれん。


MySQLからCockroachDBへの移行について

2024-05-12 21:02:04 | SQL

Migrate from MySQL (cockroachlabs.com)

の和訳を以下に示す。

MySQLからの移行
このページでは、基本的な考慮事項について説明し、MySQL から CockroachDB にデータを移行する基本的な例を示します。このページの情報は、データベースを CockroachDB に移行するための大まかなフェーズと考慮事項について説明している「移行の概要」を読んでいることを前提としています。

このページのMySQL移行例は、MOLTツールを使用してMySQLスキーマを更新し、データの初期ロードを実行し、データを検証する方法を示しています。これらの手順は、完全な移行の準備をするときに不可欠です。

先端:
CockroachDBへの移行についてサポートが必要な場合は、営業チームにお問い合わせください。

構文の違い
MySQLとCockroachDBの構文の違いにより、アプリケーションの変更が必要になる可能性があります。移行の概要の一般的な考慮事項に加えて、移行計画を作成する際には、次の MySQL 固有の情報も考慮してください。

スキーマ変換ツールを使用すると、自動変換できないMySQL構文がサマリーレポートに表示されます。これらには、次のものが含まれる場合があります。

文字列の大文字と小文字の区別
文字列は、MySQLでは大文字と小文字が区別されず、CockroachDBでは大文字と小文字が区別されます。CockroachDBから期待する結果を得るには、MySQLデータを編集する必要があるかもしれません。たとえば、MySQLで文字列比較を行っていた場合、CockroachDBで動作するように変更する必要があります。

MySQL での文字列の大文字と小文字の区別の詳細については、MySQL ドキュメントの「文字列検索での大文字と小文字の区別」を参照してください。CockroachDB 文字列の詳細については、「STRING」を参照してください。

識別子の大文字と小文字の区別
識別子は、MySQLでは大文字と小文字が区別され、CockroachDBでは大文字と小文字が区別されません。スキーマ変換ツールを使用する場合は、識別子を二重引用符で囲んで大文字と小文字を区別するか、小文字に変換して識別子を大文字と小文字を区別しないようにすることができます。

AUTO_INCREMENT属性
連続したカラム値を作成する MySQL AUTO_INCREMENT 属性は、CockroachDB ではサポートされていません。スキーマ変換ツールを使用する場合、 は シーケンス、 gen_random_uuid() は値、 unique_rowid() は一意の値を使用するように変換できます。Cockroach Labs では、シーケンスを使用して主キー列を定義することはお勧めしません。詳細については、「一意の ID のベスト プラクティス」を参照してください。AUTO_INCREMENTUUIDINT8

手記:
スキーマ変換中にカラムタイプを変更すると、MOLT Verifyはデータ検証中にタイプの不一致を識別します。これは正常な動作です。

ENUM種類
MySQLの型は、テーブルの列で定義されます。CockroachDBでは、ENUMはスタンドアロン型です。スキーマ変換ツールを使用する場合は、定義の重複を排除するか、列ごとに個別の型を作成できます。ENUMENUM

TINYINT種類
TINYINTデータ型は CockroachDB ではサポートされていません。スキーマ変換ツールは、列を自動的に INT2 () に変換します。TINYINTSMALLINT

地理空間タイプ
MySQL ジオメトリ タイプは、スキーマ変換ツールによって CockroachDB 地理空間タイプに変換されません。これらは、CockroachDBの対応する型に手動で変換する必要があります。

FIELD機能
MYSQL 関数は CockroachDB ではサポートされていません。代わりに、配列内で最初に出現する要素のインデックスを返す array_position 関数を使用できます。FIELD

使用例:

SELECT array_position(ARRAY[4,1,3,2],1);
  array_position
------------------
               2
(1 row)
要素が見つからない場合、MySQL は 0 を返しますが、CockroachDB は .したがって、関数を含むステートメントで句を使用している場合、要素が見つからない場合でも並べ替えが適用されることに注意してください。回避策として、COALESCE 演算子を使用できます。NULLORDER BYarray_position

SELECT * FROM table_a ORDER BY COALESCE(array_position(ARRAY[4,1,3,2],5),999);
MySQLデータの読み込み
次のいずれかの方法を使用して、MySQL データを CockroachDB に移行できます。

IMPORT INTO を使用して、ユーザーファイルまたはクラウドストレージを介して保存された CSV、TSV、または Avro データを CockroachDB 上の既存のテーブルに移行します。このオプションでは、最高のスループットが得られますが、インポート速度を達成するにはテーブルをオフラインにする必要があります。

先端:
CockroachDB でのインポートパフォーマンスを最適化するためのベストプラクティスについては、「インポートパフォーマンスのベストプラクティス」を参照してください。
サードパーティのデータ移行ツール(AWS DMS、Qlik、Striimなど)を使用してデータをロードします。

次の例では、を使用して初期データ・ロードを実行します。IMPORT INTO

例: CockroachDB への移行world
次の手順では、移行中のスキーマの変換、データの初期読み込みの実行、およびデータの整合性の検証を示します。

完全移行のコンテキストでは、これらの手順により、MySQLデータをCockroachDBに適切に移行し、アプリケーションクエリをクラスタに対してテストできます。詳細については、「移行の概要」を参照してください。

始める前に
この例では、MySQL ワールドデータセットを使用し、スキーマとデータをサーバーレスクラスターに移行する方法を示します。次の手順に従うには、次の手順を実行します。

ワールド データ セットをダウンロードします。

MySQLインスタンスにデータベースを作成し、ダウンロードしたファイルのパスを指定します。world

   mysqlsh -uroot --sql --file {path}/world-db/world.sql
スキーマ変換ツールへのアクセスとサーバーレスクラスターの作成に使用する無料のクラウドアカウントを作成します。

先端:
CockroachDB セルフホストデータベースに移行する場合は、変換されたスキーマをスキーマ変換ツールからエクスポートし、Cockroach SQL でステートメントを実行するか、Alembic、Flyway、Liquibase などのサードパーティのスキーマ移行ツールを使用できます。

ステップ1。MySQLスキーマの変換
スキーマ変換ツールを使用して、CockroachDB との互換性のためにスキーマを変換します。スキーマには、worldcitycountrycountrylanguage

次の mysqldump コマンドを使用して MySQL スキーマをダンプします。world

   mysqldump -uroot --no-data world > world_schema.sql
Cloud Console でスキーマ変換ツールを開き、新しい MySQL スキーマを追加します。

AUTO_INCREMENT変換オプション」で、「unique_rowid()」オプションを選択します。これにより、MySQL 型と を持つテーブル内の列が、unique_rowid() によって生成されたデフォルト値を持つ CockroachDB INT8 型に変換されます。このオプションのコンテキストについては、AUTO_INCREMENT 属性を参照してください。IDcityintAUTO_INCREMENT

と オプションは、それぞれ異なるユースケースで推奨されます。この例では、このオプションを選択すると、ソース列とターゲット列の両方が整数型になるため、後の手順でデータをロードするのがより簡単になります。UUIDunique_rowid()unique_rowid()

スキーマ変換ツールにworld_schema.sqlをアップロードします。

変換が完了したら、結果を確認します。概要レポートには、エラーがないことが示されます。これは、スキーマを CockroachDB に移行する準備ができていることを意味します。

先端:
また、MySQLデータベースの認証情報を追加して、スキーマ変換ツールがMySQLデータベースから直接スキーマを取得するようにすることもできます。
この例では、サーバーレスクラスターに直接移行します。 CockroachDB セルフホストデータベースに移行する場合は、変換されたスキーマをスキーマ変換ツールからエクスポートし、Cockroach SQL でステートメントを実行するか、Alembic、Flyway、Liquibase などのサードパーティのスキーマ移行ツールを使用できます。

変換されたスキーマを移行する前に、「ステートメント」タブをクリックして「ステートメント」リストを表示します。ステートメントまで下にスクロールし、ステートメントを編集して、列に照合順序 () を追加します。CREATE TABLE countrylanguageCOLLATE en_USlanguage

   CREATE TABLE countrylanguage (
          countrycode VARCHAR(3) DEFAULT '' NOT NULL,
          language VARCHAR(30) COLLATE en_US DEFAULT '' NOT NULL,
          isofficial countrylanguage_isofficial_enum
          DEFAULT 'F'
          NOT NULL,
          percentage DECIMAL(4,1) DEFAULT '0.0' NOT NULL,
          PRIMARY KEY (countrycode, language),
          INDEX countrycode (countrycode),
          CONSTRAINT countrylanguage_ibfk_1
                 FOREIGN KEY (countrycode) REFERENCES country (code)
   )
「保存」をクリックします。

これは、照合順序の不一致によるデータ検証の失敗を防ぐための回避策です。詳細については、MOLT Verify のドキュメントを参照してください。

[Migrate Schema] をクリックして、変換されたスキーマで新しいサーバーレスクラスターを作成します。データベースに という名前を付けます。world

このデータベースは、Cloud Console の [データベース] ページで確認できます。

CockroachDB クラスターへの SQL シェルを開きます。コマンドを見つけるには、Cloud Console で [接続] ダイアログを開き、データベースと [CockroachDB クライアント] オプションを選択します。次のようになります。worldworld

   cockroach sql --url "postgresql://{username}@{hostname}:{port}/world?sslmode=verify-full" 
大規模なインポートの場合、Cockroach Labs では、データを読み込む前にインデックスを削除し、後で再作成することをお勧めします。これにより、インポートの進行状況の可視性が向上し、各ステップを個別に再試行できるようになります。

データベースのインデックスを表示します。world

   SHOW INDEXES FROM DATABASE world;
とテーブルの外部キーインデックスは、今のところ削除できます。countrycodecitycountrylanguage

               table_name           |                   index_name                    | index_schema | non_unique | seq_in_index |   column_name   |   definition    | direction | storing | implicit | visible
   ---------------------------------+-------------------------------------------------+--------------+------------+--------------+-----------------+-----------------+-----------+---------+----------+----------
   ...
     city                           | countrycode                                     | public       |     t      |            2 | id              | id              | ASC       |    f    |    t     |    t
     city                           | countrycode                                     | public       |     t      |            1 | countrycode     | countrycode     | ASC       |    f    |    f     |    t
   ...
     countrylanguage                | countrycode                                     | public       |     t      |            1 | countrycode     | countrycode     | ASC       |    f    |    f     |    t
     countrylanguage                | countrycode                                     | public       |     t      |            2 | language        | language        | ASC       |    f    |    t     |    t
   ...
インデックスを削除します。countrycode

   DROP INDEX city@countrycode;
   DROP INDEX countrylanguage@countrycode;
データを読み込んだ後にインデックスを再作成します。

ステップ2。MySQLデータをロードする
CSV形式のデータでIMPORT INTOを使用して、データをCockroachDBにロードします。IMPORT INTO では、次の属性を持つテーブルごとに 1 つのファイルをエクスポートする必要があります。world

ファイルは、有効な CSV (カンマ区切り値) または TSV (タブ区切り値) 形式である必要があります。
区切り文字は 1 文字でなければなりません。区切り文字オプションを使用して、コンマ以外の文字 (TSV 形式のタブなど) を設定します。
ファイルは UTF-8 でエンコードする必要があります。
フィールドに次の文字のいずれかが含まれている場合は、フィールドを二重引用符で囲む必要があります。
区切り文字 (デフォルト)。,
二重引用符 () です。フィールドは二重引用符で囲まれるため、フィールド内の二重引用符の前に別の二重引用符を付けてエスケープします。例えば:。""aaa","b""bb","ccc"
改行 () です。\n
キャリッジリターン()。\r
カラムがバイト型の場合、有効な UTF-8 文字列、または で始まる 16 進数エンコードされたバイト リテラルのいずれかになります。たとえば、値がバイト であるフィールドは、 と記述されます。\x12\x0102
手記:
MySQL がデータをダンプするとき、テーブルは外部キー制約によって順序付けられず、外部キーは正しい依存関係の順序に配置されません。CockroachDBにデータをロードするときは外部キーチェックを無効にし、データがロードされた後に各テーブルで外部キーを再検証することをお勧めします。

デフォルトでは、IMPORT INTO はターゲット表のすべての外部キー制約を無効にします。

次のmysqldumpコマンドを使用してMySQLデータをダンプします。world

   mysqldump -uroot -T /{path}/world-data --fields-terminated-by ',' --fields-enclosed-by '"' --fields-escaped-by '\' --no-create-info world
これにより、データベース内の各テーブルが CSV 形式のファイルとしてパスにダンプされます。/{path}/world-data.txt

--fields-terminated-by値をタブではなくコンマで区切ることを指定します。
--fields-enclosed-byをクリックし、列の値を囲む文字とエスケープする文字をそれぞれ指定します。--fields-escaped-by
--no-create-infoデータ操作言語 (DML) のみをダンプします。
CockroachDB クラスターがアクセスできる場所でファイルをホストします。

CockroachDB クラスター内の各ノードは、インポートされるファイルにアクセスできる必要があります。クラスターがデータにアクセスする方法はいくつかあります。IMPORT INTO がプルできるストレージのタイプの詳細については、以下を参照してください。

クラウドストレージを使用する
ローカル・ファイル・サーバーの使用
Amazon S3 や Google Cloud などのクラウドストレージは、インポートするデータファイルをホストすることを強くお勧めします。

前のステップで生成されたダンプファイルは、この例用に作成されたパブリック S3 バケットですでにホストされています。

以前と同じコマンドを使用して、CockroachDB クラスターへの SQL シェルを開きます。world

   cockroach sql --url "postgresql://{username}@{hostname}:{port}/world?sslmode=verify-full" 
IMPORT INTO を使用して、各 MySQL ダンプファイルをデータベース内の対応するテーブルにインポートします。world

次のコマンドは、この例でデータダンプファイルがホストされているパブリック S3 バケットを指しています。この句は、コマンドによって生成される値を NULL として読み取る必要があることを指定します。worldnullif='\N'\Nmysqldump

先端:
インポートする行数を指定するオプションを追加できます。たとえば、テーブルの最初の 10 行をインポートします。このオプションは、時間とリソースを消費するインポートを実行する前に、エラーをすばやく検出するのに役立ちます。row_limitrow_limit = '10'
   IMPORT INTO countrylanguage
     CSV DATA (
       'https://cockroachdb-migration-examples.s3.us-east-1.amazonaws.com/mysql/world/countrylanguage.txt'
     )
     WITH
       nullif='\N';
           job_id       |  status   | fraction_completed | rows | index_entries | bytes
   ---------------------+-----------+--------------------+------+---------------+---------
     887782070812344321 | succeeded |                  1 |  984 |           984 | 171555
   IMPORT INTO country
     CSV DATA (
       'https://cockroachdb-migration-examples.s3.us-east-1.amazonaws.com/mysql/world/country.txt'
     )
     WITH
       nullif='\N';
           job_id       |  status   | fraction_completed | rows | index_entries | bytes
   ---------------------+-----------+--------------------+------+---------------+--------
     887782114360819713 | succeeded |                  1 |  239 |             0 | 33173
   IMPORT INTO city
     CSV DATA (
       'https://cockroachdb-migration-examples.s3.us-east-1.amazonaws.com/mysql/world/city.txt'
     )
     WITH
       nullif='\N';
           job_id       |  status   | fraction_completed | rows | index_entries | bytes
   ---------------------+-----------+--------------------+------+---------------+---------
     887782154421567489 | succeeded |                  1 | 4079 |          4079 | 288140
手記:
CockroachDB で動作するようにスキーマを変換した後、 のカラムは unique_rowid() によって生成されたデフォルト値を持つ INT8 になります。ただし、値が生成されるのは、値なしで新しい行が挿入された場合のみです。MySQLデータダンプには、MySQL AUTO_INCREMENT属性によって生成された連続した値が含まれており、これらはコマンドでインポートされます。idcityunique_rowid()ididIMPORT INTO
実際の移行では、主キーを複数列のキーに更新するか、一意の ID を生成する新しい主キー列を追加できます。

データをインポートする前に削除したインデックスを再作成します。

   CREATE INDEX countrycode ON city (countrycode, id);
   CREATE INDEX countrycode ON countrylanguage (countrycode, language);
ターゲット表のすべての外部キー制約が無効になることを思い出してください。と に定義されている制約を表示します。IMPORT INTOcitycountrylanguage

   SHOW CONSTRAINTS FROM city;
     table_name | constraint_name | constraint_type |                           details                            | validated
   -------------+-----------------+-----------------+--------------------------------------------------------------+------------
     city       | city_ibfk_1     | FOREIGN KEY     | FOREIGN KEY (countrycode) REFERENCES country(code) NOT VALID |     f
     city       | city_pkey       | PRIMARY KEY     | PRIMARY KEY (id ASC)                                         |     t
   SHOW CONSTRAINTS FROM countrylanguage;
       table_name    |    constraint_name     | constraint_type |                           details                            | validated
   ------------------+------------------------+-----------------+--------------------------------------------------------------+------------
     countrylanguage | countrylanguage_ibfk_1 | FOREIGN KEY     | FOREIGN KEY (countrycode) REFERENCES country(code) NOT VALID |     f
     countrylanguage | countrylanguage_pkey   | PRIMARY KEY     | PRIMARY KEY (countrycode ASC, language ASC)                  |     t
外部キーを検証するには、ALTER TABLE ...VALIDATE CONSTRAINT ステートメントを使用します。

   ALTER TABLE city VALIDATE CONSTRAINT city_ibfk_1;
   ALTER TABLE countrylanguage VALIDATE CONSTRAINT countrylanguage_ibfk_1;
ステップ3。移行されたデータを検証する
MOLT Verifyを使用して、MySQLとCockroachDBのデータの整合性を確認します。

MOLT Verifyをインストールします。

MOLT Verifyをインストールしたディレクトリで、次のコマンドを使用して2つのデータベースを比較し、MySQLのJDBC接続文字列とCockroachDBのSQL接続文字列を次のように指定します。--source--target

先端:
CockroachDB 接続文字列を見つけるには、Cloud Console で [接続] ダイアログを開き、データベースと [全般] 接続文字列オプションを選択します。world
   ./molt verify --source 'jdbc:mysql://{user}:{password}@tcp({host}:{port})/world' --target 'postgresql://{user}:{password}@{host}:{port}/world?sslmode=verify-full'
初期出力が表示されます。

   <nil> INF verification in progress
次の警告は、MySQL カラムと CockroachDB カラムの型が異なることを示しています。これは、スキーマを変換したときに一部の列が ENUM 型に変更されたため、予期される結果です。

   <nil> WRN mismatching table definition mismatch_info="column type mismatch on continent: text vs country_continent_enum" table_name=country table_schema=public
   <nil> WRN mismatching table definition mismatch_info="column type mismatch on isofficial: text vs countrylanguage_isofficial_enum" table_name=countrylanguage table_schema=public
次の出力は、MOLT Verify が検証を完了したことを示しています。

   <nil> INF finished row verification on public.country (shard 1/1): truth rows seen: 239, success: 239, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
   <nil> INF finished row verification on public.countrylanguage (shard 1/1): truth rows seen: 984, success: 984, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
   <nil> INF finished row verification on public.city (shard 1/1): truth rows seen: 4079, success: 4079, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
   <nil> INF verification complete
スキーマを移行し、初期データ読み込みを検証したら、実際の移行の次の手順は、完全な移行を実行する前に、必要なアプリケーションの変更を行ったことを確認し、アプリケーション クエリを検証し、ドライ ランを実行することです。

詳細については、「移行の概要」を参照してください。

・・・要するにMySQLからCockroachDBへの移行ツールは開発されていないということでいいんだな?