MS-SQL Server’dan PostgreSQL 10’a Veritabanı Geçişi

sqlservertoPostgresQl

Bir dönemdir PostgreSQL üzerinde çalışmalar yapıyorum ve merak ettiğim bir konu Postgres tarafında üzerinde çalışma yapacağım örnek bir veritabanı bulamamak olmuştu. Aklıma Microsoft SQL Server’ın örnek veritabanlarından “AdventureWorks” veritabanı geldi. Acaba AdventureWorks2014 veritabanı Postgres’e nasıl geçirebilirim diye düşündüm ve işte bu yazıyı yazdım.

İlk olarak “AdventureWorks2014” veritabanın olduğu bir SQL Server’a ihtiyacınız var. İkinci olarak ise PostgreSQL 10 versiyonun kurulu olduğu bir Windows / Linux bir sisteme ihtiyacınız var. SQL Server olarak kendi bilgisayarımda kurulu, PostgreSQL 10 için ise Azure’da PaaS olarak kullanıyor olacağım. ( Azure PostgreSQL Hakkında Yazımız var : )

Resim-1

Resim1’de görüldüğü gibi platformlarımız hazır. Şimdi hızlı ve kolay bir geçiş işlemi için “https://github.com/isapir/Migrate2Postgres” hazır olan projeyi kullanacağız. Bilgisayarımıza projeyi download ediyoruz.

Resim-2

Projeyi de indirdikten sonra examples > bin içerisinde yer alan “migrate.bat” dosyası ve examples → conf içerisinde yer alan “MsSqlAWT2Postgres.conf” dosyalarını aynı projenin olduğu ana dizine alıyoruz.

Resim-3

Sıra Conf dosyasını editleme işlemine geldi. Conf dosyasını bir metin düzenleyicisi ile açınca karşımıza “AdventureWorks” için hazır bir template geliyor olacak. Biz sadece burada gerekli bilgileri giriyor olacağız. Dosya desenizmi JSON Formatındandır.

{

/**

* Migration Projesi için İsim Tanımlaması

*/

name : “AdventureWorks Migration Project”

,template : “ms-sql-server” /* Uygulamanın Hangi Template Seçeceği – Default . */

,information_schema : {

/**

* This value is required for information_schema.query in the ms-sql-server template

*/

database_name : “AdventureWorks” /* Aktarımını yapacağınız Veritabanın Adı */

}

,source : “mssql” /* Aktarım işleminde kullanacağımız kaynak – Default */

,target : “postgres” /* Aktarım işleminde kullanacağımız hedef – Default */

/**

* Defines the available database connections. Each connection must

* have a connectionString key. Other keys are optional and will be

* added to the Properties object when connecting to the database.

*/

,connections : {

mssql : {

connectionString : “jdbc:sqlserver://SunucuBilgisi:ERİŞİMPORTU

,user : “dbuserName

,password : “dbuserPassword

,databaseName : “AdventureWorks” /*Migrate İşlemi yapılacak DB Name*/

}

,postgres : {

connectionString : “jdbc:postgresql://adventureworks2014-dmc.postgres.database.azure.com:5432/DBNAME?user=dbUserName&password=dbUserPassword

,user : “dbUserName

,password : “dbUserPassword

}

}

/**

* Mappings for schema names from source to target, e.g. HumanResources -> hr

*/

,schema_mapping : {

dbo : “public”,

HumanResources : “hr”

/* Schema Mapping yaparken dikkat etmeniz gereken kücük harf metin içermeli.*/

}

/**

* Mappings for table names from source to target, e.g. HumanResources -> hr

* runs before table_transform

*/

,table_mapping : {

ProductModelProductDescriptionCulture : “ProductModelProdDescCulture”

}

/**

* Mappings for column names in case the source db has keyword names like “group”

* or “primary”, or has a space that we want to remove.

* runs before column_transform

*/

,column_mapping : {

“Database Version” : “db_version”

,group : “group_name”

,primary : “is_primary”

}

,dml : {

/**

* rollback – roll back the current transaction, default

* // TODO: continue – ignore the error

* // TODO: abort – aborts the whole operation

*/

on_error : “rollback”

/**

JDBC type mapping used for DML, e.g. longnvarchar -> longvarchar

see https://docs.oracle.com/javase/8/docs/api/java/sql/JDBCType.html

and https://docs.oracle.com/javase/8/docs/api/constant-values.html#java.sql.Types.ARRAY

*/

,jdbc_type_mapping : {

longnvarchar : “longvarchar” // MSSQL ntext

,nchar : “char”

,nclob : “clob”

,nvarchar : “varchar”

}

/**

* Wrap columns with prefix and suffix in case a column name is a keyword, e.g. [key]

*/

,source_column_quote_prefix : “[”

,source_column_quote_suffix : “]”

}

/**

* Specify whether to transform the table and/or column names. Available transforms are:

* lower_case – transforms MyTableName to mytablename

* upper_case – transforms MyTableName to MYTABLENAME

* camel_to_snake_case – transforms MyTableName to my_table_name

*/

,table_transform : “camel_to_snake_case”

,column_transform : “camel_to_snake_case”

}

Yukarıdaki açıklamalara göre Config file desenimizi tamamladıktan sonra PostgreSQL sunucumuzda “AdventureWorks” isimli bir DB oluşturuyoruz. PostgreSQL’de DB oluşturma işlemini de tamamladıktan sonra aşağıdaki şekilde migrate.bat dosyasını çalıştırıyoruz.

Resim-4

Kırmızı ile işaretlediğim alanda belirtildiği gibi yazılan config file dosyasını kullanarak belirtilen path de bir sql dosyası oluşturmuştur.

Resim-5

Oluşan dosyası bir text editörü ile açıp, postgreSQL’de çalıştırmanız gerekiyor. Bu işlem ile kaynak veritabanın ddl yapısını postgreSQL tarafında oluşturmuş oluyorsunuz. DDL Scripti çalıştırdıktan sonra hatasız bir şekilde PostgreSQL tarafında “ AdventureWorks” veritabanı oluşturulduğunu görebilirsiniz.

Resim-6

Yukarıdaki resimde gördüğünüz gibi işlemimiz başarılı Microsoft Örnek veritabanlarından “ AdventureWorks” DDL obje yapısını benzer bir şekiled PostgreSQL 10 da oluşturmuş olduk. Tek yapmamız gereken SQL Server’da var olan DML içerikleri de aktarmak bunun içinde aşağıdaki gibi migrate.bat dosyasını çalıştırmamız yeterli olacaktır.

Resim-7

Yukarıdaki resimde gördüğünüz gibi DML işlemlerimiz başarılı bir şekilde başlamış ve devam ediyor. Aktarımları 4 Thread olarak yapıyor ve DDL aktarımında da kullandığı config file dan gerekli tanımlamarı alarak işlem gerçekleştiriyor.

Benzer bir aktarım işlemini SSIS ile de gerçekleştirilebilir, farklı third party uygulamalar ile de yapılabilir. Fakat PostgreSQL’in open source bir ürün oluyor olmasından ötürü github üzerinde yer alan Open Source bir yapı ile hızlı ve basitce nasıl aktarabileceğimizi göstermek istedim. PostgreSQL’e yeni başlayacak olanlar / pgsql çalışmak için dummy data arayanlar için güzel bir kaynak olacaktır.

Farklı veritabanlarınlarını da benzer şekilde migrate edebilirsiniz, fakat sql server’da tanımlı olan function, stored procedure, udf,udt,clr gibi objelerin geçişlerinini programlama bilginiz dahilinde tekrar yazmanız gerekecektir. ( https://wiki.postgresql.org/wiki/Microsoft_SQL_Server_to_PostgreSQL_Migration_by_Ian_Harding )

Aktarımlar tamamlandıktan sonra kontrol ettiğinizde SQL Server’da var olan verilerinizinde PostgreSQL’e aktarılmış olacağını göreceksiniz. Özellikle aşağıdaki sorguda version bilgisini de ekledim :)

Resim-8

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

TAGs:AdventureWorks veritabanı PostgreSQL’de sorguluyoruz., Microsoft SQL Server to PostgreSQL Migration, migrate, Postgres, PostGreSQL, PostgreSQL migrate, SQL Server, SQL Server Veritabanı PostgreSQL geçirme, Veritabanı Dönüşüm

Yazı gezinmesi

Mobil sürümden çık