İlişkisel Veritabanından Mongodb‘ye Veri Aktarımı

İbrahim Baran
3 min readMar 13, 2019

--

MongoDB, açık kaynaklı döküman tabanlı veritabanı (document database) olarak geçer ve NoSQL veritabanları içinde öncü çözümlerden biridir.

İlişkisel veritabanından mongodb’ye veriyi hızlı bir şekilde nasıl taşınabileceğini [örnek üzerinde anlatmaya çalışacağım.

İlişkisel veritabanınından okuyup eş zamanlı olarak mongodb’ye yazmaya çalıştığımızda okuma ve yazma yöntemine bağlı olarak performans kaybı yaşanabiliyor. Bazı durumlarda okuma hızı yavaş kalabilirken, bazı durumlarda da yazma yavaş kalabiliyor.

Bu tip dar boğazlardan kurtulabilmek için, veriyi ilişkisel veritabanından dosya formatına dönüştürüp yazmak gerekiyor. Sonrasında mongodb üzerinde bulunan mongoimport komutunu kullanarak veriyi ilgili tabloya (collection) aktarabiliriz. Mongoimport komutunun hızlı bir şekilde dosyadan okuyup tabloya (collection) yazmasının nedeni, mongodb için özel yazılmış olmasıdır.Bu sayede hızlı bir şekilde dosyadan okuyup yazma işlemi tamamlanmış oluyor.

Aşağıdaki adımlarla, önce dosyaya yazma işlemini sonrasında da mongodb’ye import işlemi adımlarını listeledim.

1. Dosyaya veri yazma işlemi

Bu aşamada kaynak olarak hangi veritabanını kullanıyorsanız o veritabanına ait araçlar ile dosyaya yazma işlemini hızlı bir şekilde yapabilirsiniz.

Örnek olarak oracle veritabanı için aşağıdaki gibi data_migrate.sql isimli dosyayı oluşturabiliriz.

whenever sqlerror exit 1 rollback

set echo off

set serveroutput on

set heading off

set pages 0

set space 0

set feedback off

set arraysize 100

set termout off

set timing off

set verify off

set line 2000

set trimspool on

set wrap off

spool /path/transaction.txt

select to_char(nvl(purchase_date,to_date(‘1900–01–01’,’YYYY-MM-DD’)),’YYYY-MM-DD’)||chr(9)||nvl(merchant_no,0)||chr(9)||brand||chr(9)||nvl(member_no,0) from dwh.transaction ;

spool off

exit 0;

Oluşturduğumuz bu dosyayı oracle veritabanı üzerinde aşağıdaki şekilde çağırabiliriz.

sqlplus -s user/pass@Service_Name @/home/user/data_migrate.sql

Dosyaya yazarken UTF8 formatında yazmak gerekiyor.Eğer linux ortamında NLS_LANG değişkeni atanmamışsa export NLS_LANG=.AL32UTF8 şeklinde komut çalıştırılarak ilerlenebilir.

Bu şekilde kodu çalıştırdığımızda ilgili tablodan dosyaya, kolonların aralarında tab (chr(9)) olacak şekilde yazabiliriz. Spool komutu ve yukarıdaki parametreler ile oracle veritabanından dosyaya yazma işlemini hızlı bir şekilde yapabiliyoruz.

2. Dosyayı ilgili dizine kopyalamak

Oluşan bu dosyayı mongodb ‘nin bulunduğu ya da erişebildiği sunucuya scp, ftp, sftp yöntemlerinden biriyle kopyalayabiliriz.

3. Mongodb’ye yazma işlemi

Kopyalamış olduğumuz dosyadan okuyup tabloya (collection) yazabilmek için aşağıdaki gibi komut kullanılabilir.

mongoimport — host replicaset_adı/ip_1:27017,ip_2:27017 -d db_name -c TRANSACTION — type tsv — columnsHaveTypes — fields “PURCHASE_DATE.date(2006–01–02),MERCHANT_NO.int64(),BRAND.string(),MEMBER_NO.int32()” — file /path/TRANSACTION.txt -u user -p pass — authenticationMechanism SCRAM-SHA-1

Kullanılan parametreler sıra ile aşağıdaki gibidir.

— host mongodb ip ve portları girilebilir. Eğer birden fazla sunucu var ise virgül ile ayırarak girebiliriz.

— d mongdodb komutunun çalışacağı veritabanı ismi girilir.

— c mongodb üzerinde dosyadan okunan verinin hangi tabloya (collection) yazılacağı belirtilmelidir.

— type json,csv ya da tsv değerleri girilebilir.tsv, tab kullanılan ayıraçlar için kullanılır. Dosyaya çıktığımız veriyi tab ile ayırdığımız için tsv parametresi kullanarak ilerliyoruz.

— columnsHaveTypes mongodb üzerinde eğer veri tiplerini önceden belirleyip bu şekilde veriyi içeri almak istiyorsak bu parametreyi kullanabiliriz.

İlgili örnekte kullanılan oracle veri tipleri ve karşılığı olan Mongodb veri tipleri aşağıdaki gibidir.

-u mongdodb’ye bağlanacak olan kullanıcı adı girilmelidir.

-p mongdodb’ye bağlanacak olan kullanıcını şifresi girilmelidir.

— authenticationMechanism kimlik doğrulama tipini SHA-1 hash fonksiyonunu kullanacak şekilde SCRAM-SHA-1 olarak veriyoruz.

Diğer parametre ve detaylarını aşağıdaki adresten bulabilirsiniz.

https://docs.mongodb.com/manual/reference/program/mongoimport/

Yukarıdaki mongoimport komutunu çalıştırdıktan sonraki ekran görüntüsü aşağıdaki gibidir. Bu örnekte 9572 kayıt insert edildi. Hem yüzde olarak, hem de dosya büyüklüğünün ne kadarının import edildiğini aşağıdaki gibi takip edebiliyoruz.

Görüşmek üzere.

--

--