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.
18 baris dikonversi, 8 perbaikan, tidak ada yang ditolak
Tabel di shop_2024.sqlDump MySQL 8.0.46 · ditulis oleh mysqldump · utf8mb4
customers8 baris3
7 kolom id bigint not null name varchar(100) not null email varchar(150) not null country varchar(2) not null is_active boolean not null signed_up date created_at timestamptz(0) not null orders10 baris5
9 kolom id bigint not null customer_id bigint not null status text not null total numeric(10,2) not null items integer not null ordered_at timestamp(0) not null shipped_at timestamp(0) note varchar(255) updated_at timestamptz(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
- "id" dari customers bersifat unsigned, jadi menjadi bigint dengan CHECK bahwa nilainya tidak negatif.
- "signed_up" dari customers kini mengizinkan NULL: sebagian nilainya tidak bisa disimpan dan menjadi NULL.
- Default "signed_up" di customers, 0000‑00‑00, bukan tanggal yang diterima PostgreSQL, jadi kolom itu tanpa default.
- "customer_id" dari orders bersifat unsigned, jadi menjadi bigint dengan CHECK bahwa nilainya tidak negatif.
- "id" dari orders bersifat unsigned, jadi menjadi bigint dengan CHECK bahwa nilainya tidak negatif.
- "items" dari orders bersifat unsigned, jadi menjadi integer dengan CHECK bahwa nilainya tidak negatif.
- 1 baris dari "status" di orders berisi nilai kosong yang disimpan MySQL untuk entri tidak valid; CHECK untuk nilainya mengizinkannya.
- "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.
- MySQL
- MariaDB
- PostgreSQL
- SQL Server
- SQLite
- Oracle
| dari ↓ ke → | PostgreSQL | MySQL | MariaDB | SQLite | SQL Server | Oracle |
|---|---|---|---|---|---|---|
| MySQL | MySQL ke PostgreSQL | MySQL ke MySQL | MySQL ke MariaDB | MySQL ke SQLite | MySQL ke SQL Server | MySQL ke Oracle |
| MariaDB | MariaDB ke PostgreSQL | MariaDB ke MySQL | MariaDB ke MariaDB | MariaDB ke SQLite | MariaDB ke SQL Server | MariaDB ke Oracle |
| PostgreSQL | PostgreSQL ke PostgreSQL | PostgreSQL ke MySQL | PostgreSQL ke MariaDB | PostgreSQL ke SQLite | PostgreSQL ke SQL Server | PostgreSQL ke Oracle |
| SQL Server | SQL Server ke PostgreSQL | SQL Server ke MySQL | SQL Server ke MariaDB | SQL Server ke SQLite | SQL Server ke SQL Server | SQL Server ke Oracle |
| SQLite | SQLite ke PostgreSQL | SQLite ke MySQL | SQLite ke MariaDB | SQLite ke SQLite | SQLite ke SQL Server | SQLite ke Oracle |
| Oracle | Oracle ke PostgreSQL | Oracle ke MySQL | Oracle ke MariaDB | Oracle ke SQLite | Oracle ke SQL Server | Oracle ke Oracle |
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.
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 PostgreSQLMariaDB
Dump dari mariadb-dump, mysqldump, phpMyAdmin, atau Adminer, sebagai .sql atau .sql.gz, dengan opsi yang sama seperti MySQL.
Panduan migrasi MariaDB ke PostgreSQLPostgreSQL
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 MySQLSQL 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 PostgreSQLSQLite
File database itu sendiri (.db, .sqlite, .sqlite3), atau SQL yang ditulis sqlite3 app.db .dump.
Panduan migrasi SQLite ke PostgreSQLOracle
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.