Langsung ke konten
Beranda IntoSQL

Konversi database ke database lain

Letakkan dump dari mysqldump, mariadb-dump, pg_dump, SSMS, SQL Developer, atau SQLcl, atau file .db SQLite, lalu unduh satu skrip untuk PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, atau Oracle dengan tabel, kunci, indeks, dan data yang sama. Setiap perubahan dicantumkan di laporan, dan dump tidak pernah meninggalkan komputer Anda.

File Anda
sqlshop_2024.sqlFile contoh, 5,1 kB
Database Anda

18 baris dikonversi, 8 perbaikan, tidak ada yang ditolak

Tampilkan

Tabel di shop_2024.sqlDump MySQL 8.0.46 · ditulis oleh mysqldump · utf8mb4

  • customers8 baris3
    7 kolom
    idbigint not null
    namevarchar(100) not null
    emailvarchar(150) not null
    countryvarchar(2) not null
    is_activeboolean not null
    signed_update
    created_attimestamptz(0) not null
  • orders10 baris5
    9 kolom
    idbigint not null
    customer_idbigint not null
    statustext not null
    totalnumeric(10,2) not null
    itemsinteger not null
    ordered_attimestamp(0) not null
    shipped_attimestamp(0)
    notevarchar(255)
    updated_attimestamptz(0) not null
-- Written by IntoSQL from a MySQL dump. Load it with: psql -v ON_ERROR_STOP=1 -f <file>
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET synchronous_commit = off;
SET maintenance_work_mem = '512MB';

CREATE TABLE customers (
    id bigint GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    name varchar(100) NOT NULL,
    email varchar(150) NOT NULL,
    country varchar(2) DEFAULT 'US' NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    signed_up date,
    created_at timestamptz(0) DEFAULT CURRENT_TIMESTAMP NOT NULL,
    CONSTRAINT customers_id_check CHECK (id >= 0)
);

CREATE TABLE orders (
    id bigint GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    customer_id bigint NOT NULL,
    status text DEFAULT 'pending' NOT NULL,
    total numeric(10,2) NOT NULL,
    items integer DEFAULT 1 NOT NULL,
    ordered_at timestamp(0) NOT NULL,
    shipped_at timestamp(0),
    note varchar(255),
    updated_at timestamptz(0) DEFAULT CURRENT_TIMESTAMP NOT NULL,
    CONSTRAINT orders_id_check CHECK (id >= 0),
    CONSTRAINT orders_customer_id_check CHECK (customer_id >= 0),
    CONSTRAINT orders_status_check CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled', '')),
    CONSTRAINT orders_items_check CHECK (items >= 0)
);

COPY customers (id, name, email, country, is_active, signed_up, created_at) FROM stdin;
1	Ana Martínez	ana@example.com	MX	t	2023-01-15	2023-01-15 10:24:00+00:00
2	Zoë Müller	zoe@example.de	DE	t	2023-02-03	2023-02-03 08:11:42+00:00
3	José Peña	jose@example.es	ES	f	2023-03-21	2023-03-21 19:05:17+00:00
4	李雷	lilei@example.cn	CN	t	2023-05-09	2023-05-09 02:40:00+00:00
5	Noah O'Brien	noah@example.ie	IE	t	\N	2023-06-30 14:00:00+00:00
6	Amélie Laurent	amelie@example.fr	FR	t	2024-01-02	2024-01-02 09:30:00+00:00
7	Ravi Patel	ravi@example.in	IN	f	2024-02-29	2024-02-29 23:59:59+00:00
8	Sofia Rossi 🌻	sofia@example.it	IT	t	2024-04-12	2024-04-12 12:12:12+00:00
\.

COPY orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, updated_at) FROM stdin;
1	1	shipped	129.90	3	2024-03-01 10:00:00	2024-03-02 16:30:00	\N	2024-03-02 16:30:00+00:00
2	2	paid	54.00	1	2024-03-02 11:15:00	\N	Gift wrap 🎁	2024-03-02 11:20:00+00:00
3	1	cancelled	12.50	1	2024-03-03 09:45:00	\N	Customer changed their mind	2024-03-03 10:00:00+00:00
4	4	shipped	980.00	12	2024-03-05 02:10:00	2024-03-07 08:00:00	请小心轻放	2024-03-07 08:00:00+00:00
5	5	pending	45.75	2	2024-03-08 17:20:00	\N	Leave at the door; ring twice	2024-03-08 17:20:00+00:00
6	6	shipped	310.40	5	2024-03-10 13:00:00	2024-03-11 09:00:00	Fragile: "glass"	2024-03-11 09:00:00+00:00
7	8	paid	76.20	2	2024-03-11 18:45:00	\N	\N	2024-03-11 18:46:00+00:00
8	2		19.99	1	2024-03-12 08:00:00	\N	Status lost in an old import	2024-03-12 08:00:00+00:00
9	3	shipped	64.00	2	2024-03-14 15:30:00	\N	Shipping date never recorded	2024-03-15 10:00:00+00:00
10	7	paid	1499.00	1	2024-03-15 21:05:00	\N	C:\\Users\\ravi\\invoice.pdf	2024-03-15 21:05:00+00:00
\.


-- Keys, indexes and constraints, after the rows so each builds once.
CREATE UNIQUE INDEX customers_pkey ON customers (id);
CREATE UNIQUE INDEX customers_uq_email ON customers (email);
CREATE UNIQUE INDEX orders_pkey ON orders (id);
CREATE INDEX orders_idx_customer ON orders (customer_id);
CREATE INDEX orders_idx_status_date ON orders (status, ordered_at);
ALTER TABLE customers ADD CONSTRAINT customers_pkey PRIMARY KEY USING INDEX customers_pkey;
ALTER TABLE customers ADD CONSTRAINT customers_uq_email UNIQUE USING INDEX customers_uq_email;
ALTER TABLE orders ADD CONSTRAINT orders_pkey PRIMARY KEY USING INDEX orders_pkey;
ALTER TABLE orders ADD CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers (id) NOT VALID;
DO $f$ BEGIN
    ALTER TABLE orders VALIDATE CONSTRAINT fk_orders_customer;
EXCEPTION WHEN foreign_key_violation THEN
    RAISE WARNING 'foreign key % has rows without a parent: it stays NOT VALID, and new rows are checked', 'fk_orders_customer';
END $f$;
SELECT setval(pg_get_serial_sequence('customers', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM customers)::numeric, 0) + 1, 1001), 9223372036854775807)::bigint, false);
COMMENT ON TABLE customers IS 'People who bought at least once';
SELECT setval(pg_get_serial_sequence('orders', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM orders)::numeric, 0) + 1, 5001), 9223372036854775807)::bigint, false);
CREATE FUNCTION orders_updated_at_on_update() RETURNS trigger LANGUAGE plpgsql AS $f$
BEGIN
    IF NEW IS DISTINCT FROM OLD AND NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at THEN
        NEW.updated_at := CURRENT_TIMESTAMP;
    END IF;
    RETURN NEW;
END
$f$;
CREATE TRIGGER orders_updated_at_on_update BEFORE UPDATE ON orders FOR EACH ROW EXECUTE FUNCTION orders_updated_at_on_update();

Perbaikan

  1. "id" dari customers bersifat unsigned, jadi menjadi bigint dengan CHECK bahwa nilainya tidak negatif.
  2. "signed_up" dari customers kini mengizinkan NULL: sebagian nilainya tidak bisa disimpan dan menjadi NULL.
  3. Default "signed_up" di customers, 0000‑00‑00, bukan tanggal yang diterima PostgreSQL, jadi kolom itu tanpa default.
  4. "customer_id" dari orders bersifat unsigned, jadi menjadi bigint dengan CHECK bahwa nilainya tidak negatif.
  5. "id" dari orders bersifat unsigned, jadi menjadi bigint dengan CHECK bahwa nilainya tidak negatif.
  6. "items" dari orders bersifat unsigned, jadi menjadi integer dengan CHECK bahwa nilainya tidak negatif.
  7. 1 baris dari "status" di orders berisi nilai kosong yang disimpan MySQL untuk entri tidak valid; CHECK untuk nilainya mengizinkannya.
  8. "updated_at" dari orders berubah ke waktu saat ini di setiap pembaruan; di PostgreSQL, trigger yang melakukannya.

Perlu diperiksa

  • 1 nilai di "signed_up" dari customers adalah tanggal nol atau mustahil, misalnya 0000‑00‑00, yang tidak bisa disimpan PostgreSQL, jadi menjadi NULL. Jika tanggal itu bermakna, ganti di sumber dengan tanggal sungguhan sebelum membuat dump.
  • 1 nilai di "shipped_at" dari orders adalah tanggal nol atau mustahil, misalnya 0000‑00‑00 00:00:00, yang tidak bisa disimpan PostgreSQL, jadi menjadi NULL. Jika tanggal itu bermakna, ganti di sumber dengan tanggal sungguhan sebelum membuat dump.

File Anda dikonversi di komputer ini dan tidak pernah diunggah.

Contoh lain:

Setiap pasangan database

Baris adalah database asal dump, kolom adalah database tujuan skrip. Setiap pasangan punya halaman sendiri dengan konverter yang disiapkan untuknya, aturan yang diterapkannya, dan cara memuat skripnya.

Tipe data untuk setiap pasangan

Apa yang dipertahankan dan apa yang dilaporkan

Konverter membaca dump itu sendiri, tanpa server database, dan menulis skrip dari isinya. Halaman setiap pasangan mencantumkan aturan yang diterapkannya, antara 25 dan 67 per pasangan, beserta baris laporan yang ditulis setiap aturan.

Dipertahankan di skrip

  • Tabel dan kolom, masing-masing dengan tipe terdekat yang dimiliki target beserta panjang dan presisinya.
  • Primary key, unique key, dan foreign key, indeks, dan nilai default.
  • Kolom AUTO_INCREMENT, identity, dan serial, dengan id setiap baris dan penghitung yang berlanjut dari posisi terakhir di dump.
  • Setiap baris, dengan tanggal, desimal, teks, dan nilai biner persis seperti di dump.

Dicantumkan di laporan

  • Nilai yang tidak bisa disimpan target apa adanya, seperti tanggal 0000-00-00 di PostgreSQL, beserta kolom dan jumlahnya.invalid_date_null
  • Tipe yang tidak dimiliki target, seperti ENUM atau INET6, beserta tipe hasil konversinya.type_replaced
  • View, trigger, procedure, fungsi, dan event, berdasarkan nama: semuanya ditulis dalam bahasa masing-masing database, jadi tidak dikonversi.not_converted_objects
  • Teks yang tidak valid dalam set karakternya, dan dump yang sudah kehilangan karakter 4 byte.invalid_utf8_replaced

Diukur terhadap pgloader

Dump yang sama, dikonversi dan dimuat oleh IntoSQL dan oleh pgloader 3.6.7 di satu mesin (i9-10900K 10 inti dengan SATA SSD), pada Oktober 2026.

  • Kolom TINYINT(1) berisi 2, -1, dan -5: pgloader memuat true untuk masing-masing, tanpa peringatan. IntoSQL mempertahankan angkanya dan laporan menjelaskan alasannya.
  • Dump dengan default 'it's', tabel yang namanya memakai backtick, ENUM berisi nilai kosong, dan TIME lebih dari 24 jam: pgloader berhenti. IntoSQL mengonversi dan memuatnya.
  • Yang dimuat pgloader kehilangan primary key, unique key, foreign key, dan identity-nya. IntoSQL mempertahankan semuanya.
  • Dump 5.3 GB berisi 30 juta baris: pgloader memerlukan dump itu dipulihkan dulu ke MySQL yang berjalan, yang memakan 18 menit, lalu kehabisan memori dengan pengaturan bawaannya. IntoSQL mengonversi dump dalam 10 detik, dan psql memuat skripnya dalam sekitar 3 menit.
  • Pada 476 dump dari MySQL 5.5 sampai 9 dan MariaDB 10.3 sampai 12, yang dimuat ke PostgreSQL 13 dan 18: tidak ada galat pemuatan, dan tidak ada nilai yang berubah tanpa satu baris di laporan.
Halaman MySQL ke PostgreSQL

Ekspor database yang Anda miliki

Konverter membaca file, bukan server yang sedang berjalan. Setiap database menulis file itu dengan alatnya sendiri:

  • MySQL

    Dump dari mysqldump, mysqlpump, phpMyAdmin, atau Adminer, sebagai .sql atau .sql.gz. --default-character-set=utf8mb4 --hex-blob --routines --triggers --events mempertahankan paling banyak.

    Panduan migrasi MySQL ke PostgreSQL
  • MariaDB

    Dump dari mariadb-dump, mysqldump, phpMyAdmin, atau Adminer, sebagai .sql atau .sql.gz, dengan opsi yang sama seperti MySQL.

    Panduan migrasi MariaDB ke PostgreSQL
  • PostgreSQL

    Dump biasa dari pg_dump atau pg_dumpall. Arsip custom (-Fc) diubah menjadi dump biasa dengan pg_restore -f dump.sql, tanpa server.

    Panduan migrasi PostgreSQL ke MySQL
  • SQL Server

    Skrip yang ditulis Generate Scripts di SSMS, dengan Types of data to script diatur ke Schema and data. dbatools dan mssql-scripter menulis hal yang sama.

    Panduan migrasi SQL Server ke PostgreSQL
  • SQLite

    File database itu sendiri (.db, .sqlite, .sqlite3), atau SQL yang ditulis sqlite3 app.db .dump.

    Panduan migrasi SQLite ke PostgreSQL
  • Oracle

    File .sql yang ditulis Database Export di SQL Developer atau SQLcl, dengan pernyataan DDL dan Insert. File .dmp dari exp atau expdp harus diimpor lalu diekspor ulang terlebih dahulu.

    Panduan migrasi Oracle ke PostgreSQL

Pertanyaan tentang migrasi database

Tidak terjawab di sini? Tulis ke kami dari halaman kontak, dan seseorang akan membalas. Halaman kontak

Apakah dump saya diunggah?

Tidak. Konverter berjalan di browser Anda dan membaca dump dari disk Anda sepotong demi sepotong, jadi dump tidak pernah meninggalkan komputer Anda. Aplikasi desktop dan command line juga mengonversi di komputer Anda.

Seberapa besar dump yang bisa dipakai?

Konverter tidak pernah menyimpan seluruh dump di memori: file dibaca dua kali, per rentang, dan skrip ditulis sambil berjalan. Dump berukuran beberapa gigabyte bisa dikonversi di browser, di aplikasi desktop, dan dengan command line.

Dump bisa berasal dari versi apa saja?

MySQL 5.5 sampai 9, MariaDB 10.3 sampai 12, PostgreSQL 10 dan yang lebih baru, SQL Server 2017 dan yang lebih baru, SQLite 3.0 dan yang lebih baru, serta Oracle 11g dan yang lebih baru. Halaman setiap pasangan menyebutkan versi tempat skripnya dimuat.

Apakah saya perlu server database yang berjalan?

Tidak. Konverter membaca file dump itu sendiri, jadi database sumber tidak perlu berjalan di mana pun. Skrip dimuat dengan klien milik target, seperti psql, mysql, atau sqlcmd.

Apa yang tidak dikonversi?

View, trigger, stored procedure, fungsi, dan event ditulis dalam bahasa masing-masing database, jadi semuanya dicantumkan di laporan berdasarkan nama. Tabel, kunci, indeks, dan baris semuanya ada di skrip.

Bisakah skrip dimuat langsung ke database saya?

Aplikasi desktop dan perintah intosql load menulis langsung ke SQLite secara gratis, dan ke PostgreSQL, MySQL, dan MariaDB dengan IntoSQL Pro. Untuk SQL Server dan Oracle, jalankan skrip dengan sqlcmd atau sqlplus.