Chuyển đến nội dung
Trang chủ IntoSQL

Chuyển một cơ sở dữ liệu sang cơ sở dữ liệu khác

Thả bản dump từ mysqldump, mariadb-dump, pg_dump, SSMS, SQL Developer hoặc SQLcl, hoặc tệp SQLite .db, và tải xuống một tập lệnh cho PostgreSQL, MySQL, MariaDB, SQLite, SQL Server hoặc Oracle với cùng bảng, khóa, chỉ mục và dữ liệu. Mọi thay đổi được liệt kê trong báo cáo, và bản dump không bao giờ rời khỏi máy tính của bạn.

Tệp của bạn
sqlshop_2024.sqlTệp mẫu, 5,1 kB
Cơ sở dữ liệu của bạn

Đã chuyển đổi 18 hàng, 8 bản sửa, không hàng nào bị từ chối

Hiển thị

Các bảng trong shop_2024.sqlBản dump MySQL 8.0.46 · do mysqldump ghi · utf8mb4

  • customers8 hàng3
    7 cột
    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 hàng5
    9 cột
    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();

Bản sửa

  1. "id" của customers là số không dấu, nên được chuyển thành bigint kèm ràng buộc kiểm tra không âm.
  2. "signed_up" của customers giờ cho phép NULL: một số giá trị không lưu được và là NULL.
  3. Giá trị mặc định của "signed_up" trong customers, 0000‑00‑00, không phải ngày PostgreSQL chấp nhận, nên cột không có giá trị mặc định.
  4. "customer_id" của orders là số không dấu, nên được chuyển thành bigint kèm ràng buộc kiểm tra không âm.
  5. "id" của orders là số không dấu, nên được chuyển thành bigint kèm ràng buộc kiểm tra không âm.
  6. "items" của orders là số không dấu, nên được chuyển thành integer kèm ràng buộc kiểm tra không âm.
  7. 1 hàng của "status" trong orders chứa giá trị rỗng mà MySQL lưu cho mục không hợp lệ; ràng buộc kiểm tra giá trị cho phép giá trị này.
  8. "updated_at" của orders đổi thành thời điểm hiện tại mỗi lần cập nhật; trong PostgreSQL, một trình kích hoạt làm việc đó.

Cần xem lại

  • 1 giá trị trong "signed_up" của customers là ngày bằng 0 hoặc không hợp lệ, như 0000‑00‑00, mà PostgreSQL không lưu được, nên được đặt thành NULL. Nếu các ngày đó có ý nghĩa, hãy thay chúng bằng ngày thật trong nguồn trước khi tạo bản dump.
  • 1 giá trị trong "shipped_at" của orders là ngày bằng 0 hoặc không hợp lệ, như 0000‑00‑00 00:00:00, mà PostgreSQL không lưu được, nên được đặt thành NULL. Nếu các ngày đó có ý nghĩa, hãy thay chúng bằng ngày thật trong nguồn trước khi tạo bản dump.

Tệp được chuyển đổi ngay trên máy tính này và không bao giờ được tải lên.

Mẫu khác:

Mọi cặp cơ sở dữ liệu

Hàng là cơ sở dữ liệu nguồn của bản dump, cột là cơ sở dữ liệu đích của tập lệnh. Mỗi cặp có trang riêng với trình chuyển đổi đã thiết lập, các quy tắc áp dụng và cách nạp tập lệnh.

Kiểu dữ liệu của mọi cặp

Những gì được giữ và những gì được báo cáo

Trình chuyển đổi đọc trực tiếp bản dump, không cần máy chủ cơ sở dữ liệu, và viết tập lệnh từ nội dung của nó. Trang của mỗi cặp liệt kê các quy tắc áp dụng, từ 25 đến 67 mỗi cặp, cùng dòng báo cáo mà mỗi quy tắc viết.

Giữ trong tập lệnh

  • Bảng và cột, mỗi cột với kiểu gần nhất mà đích có, cùng độ dài và độ chính xác.
  • Khóa chính, khóa duy nhất, khóa ngoại, chỉ mục và giá trị mặc định.
  • Cột AUTO_INCREMENT, identity và serial, giữ id của từng hàng và bộ đếm tiếp tục từ chỗ bản dump dừng lại.
  • Mọi hàng, với ngày, số thập phân, văn bản và giá trị nhị phân đúng như bản dump.

Liệt kê trong báo cáo

  • Giá trị đích không chứa được nguyên trạng, như ngày 0000-00-00 trong PostgreSQL, kèm cột và số lượng.invalid_date_null
  • Kiểu đích không có, như ENUM hoặc INET6, cùng kiểu mà mỗi kiểu đã thành.type_replaced
  • View, trigger, thủ tục, hàm và sự kiện, theo tên: chúng được viết bằng ngôn ngữ riêng của từng cơ sở dữ liệu nên không được chuyển đổi.not_converted_objects
  • Văn bản không hợp lệ trong bộ ký tự của nó, và bản dump đã mất ký tự 4 byte.invalid_utf8_replaced

Đo đối chiếu với pgloader

Cùng các bản dump, được IntoSQL và pgloader 3.6.7 chuyển đổi và nạp trên cùng một máy (i9-10900K 10 nhân với SATA SSD), vào tháng 10 năm 2026.

  • Cột TINYINT(1) chứa 2, -1 và -5: pgloader nạp true cho từng giá trị, không có cảnh báo. IntoSQL giữ các số và báo cáo giải thích lý do.
  • Bản dump có giá trị mặc định 'it's', bảng có tên chứa dấu backtick, ENUM chứa giá trị rỗng và TIME trên 24 giờ: pgloader dừng lại. IntoSQL chuyển đổi và nạp được.
  • Dữ liệu pgloader nạp đã mất khóa chính, khóa duy nhất, khóa ngoại và identity. IntoSQL giữ tất cả.
  • Bản dump 5.3 GB với 30 triệu hàng: pgloader cần khôi phục nó vào một MySQL đang chạy trước, mất 18 phút, rồi hết bộ nhớ với cấu hình mặc định. IntoSQL chuyển đổi bản dump trong 10 giây, và psql nạp tập lệnh trong khoảng 3 phút.
  • Trên 476 bản dump từ MySQL 5.5 đến 9 và MariaDB 10.3 đến 12, nạp vào PostgreSQL 13 và 18: không có lỗi nạp, và không giá trị nào thay đổi mà không có dòng trong báo cáo.
Trang MySQL sang PostgreSQL

Xuất cơ sở dữ liệu bạn đang có

Trình chuyển đổi đọc một tệp, không phải máy chủ đang chạy. Mỗi cơ sở dữ liệu viết tệp bằng công cụ riêng:

Câu hỏi về di chuyển cơ sở dữ liệu

Chưa có câu trả lời ở đây? Hãy viết cho chúng tôi từ trang liên hệ, sẽ có người trả lời. Trang liên hệ

Bản dump của tôi có bị tải lên không?

Không. Trình chuyển đổi chạy trong trình duyệt và đọc bản dump từ ổ đĩa theo từng phần, nên nó không bao giờ rời khỏi máy tính của bạn. Ứng dụng máy tính và dòng lệnh cũng chuyển đổi ngay trên máy tính của bạn.

Bản dump có thể lớn đến đâu?

Trình chuyển đổi không bao giờ giữ toàn bộ bản dump trong bộ nhớ: nó đọc tệp hai lần, theo từng đoạn, và ghi tập lệnh trong lúc đọc. Bản dump nhiều gigabyte vẫn chuyển đổi được trong trình duyệt, trong ứng dụng máy tính và bằng dòng lệnh.

Bản dump có thể đến từ những phiên bản nào?

MySQL 5.5 đến 9, MariaDB 10.3 đến 12, PostgreSQL 10 trở lên, SQL Server 2017 trở lên, SQLite 3.0 trở lên và Oracle 11g trở lên. Trang của mỗi cặp cho biết tập lệnh nạp được trên những phiên bản nào.

Tôi có cần máy chủ cơ sở dữ liệu đang chạy không?

Không. Trình chuyển đổi đọc trực tiếp tệp dump, nên cơ sở dữ liệu nguồn không cần chạy ở đâu cả. Tập lệnh được nạp bằng client của đích, như psql, mysql hoặc sqlcmd.

Những gì không được chuyển đổi?

View, trigger, thủ tục lưu trữ, hàm và sự kiện được viết bằng ngôn ngữ riêng của từng cơ sở dữ liệu, nên chúng được liệt kê theo tên trong báo cáo. Bảng, khóa, chỉ mục và hàng đều có trong tập lệnh.

Có thể nạp tập lệnh thẳng vào cơ sở dữ liệu của tôi không?

Ứng dụng máy tính và lệnh intosql load ghi thẳng vào SQLite miễn phí, và vào PostgreSQL, MySQL, MariaDB với IntoSQL Pro. Với SQL Server và Oracle, hãy chạy tập lệnh bằng sqlcmd hoặc sqlplus.