Memindahkan data dari Oracle ke MySQL adalah pekerjaan yang lumayan sering ditemui — entah karena penghematan biaya lisensi, penyederhanaan infrastruktur, atau migrasi ke stack yang lebih ringan. Untuk tabel kecil, migrasi ini sepele. Tapi begitu datanya membengkak hingga jutaan baris, pendekatan asal-asalan bisa berujung proses berjam-jam, kehabisan memori, atau bahkan gagal di tengah jalan.
Artikel ini membahas strategi migrasi Oracle ke MySQL yang tetap cepat dan andal meski datanya besar, mulai dari ekspor, penyesuaian tipe data, impor massal, hingga verifikasi hasil.

Tantangan Migrasi Dataset Besar
Sebelum masuk ke langkah teknis, penting memahami apa saja yang membuat migrasi dataset besar berbeda:
- Perbedaan tipe data. Oracle punya tipe seperti
NUMBER,VARCHAR2,CLOB, danDATEyang tidak selalu punya padanan langsung di MySQL. - Format tanggal berbeda. Oracle kerap menyimpan tanggal dengan format khas yang perlu dikonversi ke format
YYYY-MM-DDmilik MySQL. - Volume data. Menyisipkan jutaan baris satu per satu (
INSERT) sangat lambat — kita butuh impor massal. - Integritas. Foreign key, indeks, dan constraint bisa memperlambat impor bila aktif selama proses.
Strategi Umum: Ekspor ke CSV lalu LOAD DATA INFILE
Untuk dataset besar, pendekatan paling efisien dan universal adalah: ekspor data Oracle menjadi file CSV, lalu impor ke MySQL menggunakan LOAD DATA INFILE. Alasannya, LOAD DATA INFILE membaca file sekaligus di sisi server sehingga jauh lebih cepat daripada ribuan perintah INSERT. Mari kita lakukan bertahap.
Langkah 1: Ekspor Data dari Oracle ke CSV
Ada beberapa cara mengeluarkan data Oracle sebagai CSV. Cara yang paling ringan untuk data besar adalah memakai SQL*Plus dengan mode spool. Buat skrip seperti berikut:
SET HEADING OFF SET FEEDBACK OFF SET PAGESIZE 0 SET LINESIZE 32767 SET TRIMSPOOL ON SET COLSEP ',' SPOOL C:/migrasi/pelanggan.csv SELECT id || ',' || nama || ',' || TO_CHAR(tgl_daftar,'YYYY-MM-DD') || ',' || saldo FROM pelanggan; SPOOL OFF
Perhatikan penggunaan TO_CHAR(tgl_daftar,'YYYY-MM-DD') untuk langsung mengubah tanggal Oracle ke format yang dipahami MySQL. Menggabungkan kolom dengan operator || memberi kita kontrol penuh atas pemisah dan format tiap kolom.
Alternatif yang lebih nyaman, Anda bisa memakai fitur ekspor di Oracle SQL Developer (klik kanan tabel → Export → format CSV) — praktis untuk data yang tidak terlalu ekstrem besarnya.
Langkah 2: Siapkan Struktur Tabel di MySQL
Buat tabel tujuan di MySQL dengan tipe data yang setara. Berikut panduan pemetaan tipe yang umum:
| Oracle | Padanan MySQL |
|---|---|
| NUMBER(p,0) | INT / BIGINT |
| NUMBER(p,s) | DECIMAL(p,s) |
| VARCHAR2(n) | VARCHAR(n) |
| CHAR(n) | CHAR(n) |
| DATE | DATETIME / DATE |
| TIMESTAMP | TIMESTAMP / DATETIME |
| CLOB | LONGTEXT |
| BLOB | LONGBLOB |
Contoh tabel tujuan:
CREATE TABLE pelanggan (
id BIGINT PRIMARY KEY,
nama VARCHAR(100),
tgl_daftar DATE,
saldo DECIMAL(15,2)
) ENGINE=InnoDB;
Langkah 3: Impor Massal dengan LOAD DATA INFILE
Inilah inti percepatan. Alih-alih menyisipkan baris satu per satu, kita muat seluruh CSV sekaligus:
LOAD DATA INFILE 'C:/migrasi/pelanggan.csv' INTO TABLE pelanggan FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (id, nama, tgl_daftar, saldo);
Untuk file yang berada di komputer klien, gunakan LOAD DATA LOCAL INFILE. Pastikan opsi local_infile aktif dan file diletakkan di folder yang diizinkan secure_file_priv.
Langkah 4: Mempercepat Impor Jutaan Baris
Saat data mencapai jutaan baris, matikan sementara pengecekan yang memperlambat, lalu nyalakan lagi setelah selesai:
SET autocommit = 0; SET unique_checks = 0; SET foreign_key_checks = 0; -- jalankan LOAD DATA INFILE di sini COMMIT; SET unique_checks = 1; SET foreign_key_checks = 1;
Selain itu, pertimbangkan strategi berikut:
- Impor dulu, indeks belakangan. Buat indeks non-primary setelah data masuk agar MySQL tidak sibuk memperbarui indeks di tiap baris.
- Pecah file yang sangat besar. File 20 juta baris bisa dipecah menjadi beberapa bagian lalu diimpor bergiliran untuk memudahkan pemantauan dan pemulihan bila gagal.
- Naikkan buffer InnoDB. Menyetel
innodb_buffer_pool_sizelebih besar sementara waktu membantu impor besar.
Langkah 5: Menangani Perbedaan Format Data
Sering kali data Oracle butuh sedikit transformasi saat impor. LOAD DATA INFILE mendukung ini lewat variabel dan klausa SET. Contoh mengubah format tanggal yang belum sesuai dan menormalkan nilai kosong:
LOAD DATA INFILE 'C:/migrasi/transaksi.csv'
INTO TABLE transaksi
FIELDS TERMINATED BY ','
(id, @tgl, kode, @nominal)
SET tanggal = STR_TO_DATE(@tgl, '%d-%b-%y'),
nominal = NULLIF(@nominal, '');
Di sini STR_TO_DATE menerjemahkan format tanggal ala Oracle (misalnya 12-JUN-26) ke tipe DATE MySQL, sementara NULLIF mengubah string kosong menjadi NULL.
Langkah 6: Verifikasi Hasil Migrasi
Jangan pernah menganggap migrasi selesai sebelum diverifikasi. Minimal lakukan dua pengecekan berikut.
Bandingkan jumlah baris di Oracle dan MySQL — keduanya harus sama:
SELECT COUNT(*) FROM pelanggan;
Bandingkan nilai agregat untuk memastikan angka tidak berubah akibat kesalahan tipe data:
SELECT SUM(saldo), MIN(tgl_daftar), MAX(tgl_daftar) FROM pelanggan;
Jika jumlah baris dan agregat cocok di kedua sisi, migrasi Anda berhasil dengan integritas terjaga.
Alat Bantu Otomatis
Selain metode manual di atas, ada beberapa alat yang bisa mengotomatiskan migrasi, terutama untuk skema yang rumit:
- MySQL Workbench Migration Wizard — mendukung migrasi langsung dari berbagai sumber dengan pemetaan tipe otomatis.
- Oracle SQL Developer — punya fitur ekspor ke format MySQL.
- Skrip ETL kustom — untuk kebutuhan khusus dengan transformasi kompleks.
Namun untuk dataset yang sangat besar, kombinasi ekspor CSV + LOAD DATA INFILE tetap menjadi yang paling cepat dan dapat diandalkan karena minim overhead.
Contoh Kasus Nyata: Migrasi Sistem Warisan
Sebuah perusahaan hendak memensiunkan server Oracle warisan yang menyimpan 20 juta baris data transaksi. Migrasi dengan tool GUI selalu timeout di tengah jalan. Tim akhirnya menempuh jalur manual: mengekspor data per bulan menjadi 24 file CSV memakai SPOOL, mematikan foreign_key_checks, lalu mengimpor tiap file dengan LOAD DATA INFILE. Seluruh migrasi 20 juta baris rampung dalam waktu di bawah satu jam — dengan verifikasi jumlah baris dan total nominal yang cocok sempurna di kedua database.
Penutup
Migrasi Oracle ke MySQL untuk dataset besar bukan soal menekan satu tombol, melainkan strategi yang tepat: ekspor efisien ke CSV, pemetaan tipe data yang cermat, impor massal dengan LOAD DATA INFILE, mematikan sementara pengecekan yang memperlambat, transformasi format saat impor, dan verifikasi yang teliti. Ikuti alur ini, dan migrasi jutaan baris pun bisa selesai dalam hitungan menit hingga jam, bukan berhari-hari.
Referensi: untuk pendalaman lebih lanjut, kunjungi dokumentasi resmi MySQL.

