Çalışan bir Drupal 7 sitesinin MySql’den Postgresql’e geçirilmesi

Önce repository bilgilerimizi güncelleyelim:

$ sudo apt update

Sonra postgresql’i kuralım:

$ sudo apt install postgresql postgresql-contrib

Eğer her şey yolunda gittiyse Ubuntu’ya postgresql kurulmuş ve bir servis olarak başlatılmış olacaktır. Postgresql servisinin durumunu kontrol edelim:

Active: active (exited) since Wed 2018-11-14 10:22:29 +03; 1h 15min ago
Main PID: 57606 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/postgresql.service
Nov 14 10:22:29 PortalSrv01 systemd[1]: Starting PostgreSQL RDBMS...
Nov 14 10:22:29 PortalSrv01 systemd[1]: Started PostgreSQL RDBMS.
Nov 14 10:22:35 PortalSrv01 systemd[1]: Started PostgreSQL RDBMS.

Postgresql servisimizi her zaman şu komutla yeniden başlatabiliriz:

$ sudo service postgresql restart

Şimdi sıra postgresql veritabanına bağlanarak yeni kullanıcı oluşturmaya geldi. Postgesql “ident authentication” denilen yöntemi kullanır. Buna göre (kullanıcı ve gruba karşılık gelen) Postgresql rolleri, aynı isimli bir Linux kullanıcı adıyla eşleştirilir. Kurulum esnasında postgres diye bir kullanıcı otomatik olarak oluşturulur. Bu hem Unix hem postgresql kullanıcısıdır. Şimdi sisteme bu kullanıcı ile girelim ve postgrsql konsoluna erişelim:

$ sudo -i -u postgres
$ psql
postgres=#

Bu konsol üzerinden sql komutları çalıştırabiliriz. Çıkmak için ters slash q yazmamız gerekir:

postgres=# \q

Şimdi yeni kullanıcımızı oluşturalım. Yeni kullanıcımızın ismi psqladmin olsun. Bunun için önce “createuser –interactive” komutunu vereceğiz. Yeni kullanıcımızın ismi ne olsun diye soracak. İsmi girdikten sonra “Shall the new role be a superuser? (y/n)” yani yeni oluşturulan kullanıcı admin yetkilerine sahip olsun mu diye soracak. Ona da “y” diyerek evet cevabını verelim:

$ createuser –interactive
Enter name of role to add: psqladmin
Shall the new role be a superuser? (y/n) y

Yeni postgre kullanıcımız oluşturduk. Şimdi exit yazarak postgres kullanıcısı olmaktan çıkalım ve bu veritabanı kullanıcısına karşılık gelecek, aynı isimli Linux kullanıcısını oluşturalım. Vermemiz gereken komut “sudo adduser psqladmin”. Bu komutu verince bize yeni kullanıcının şifresini soracak, sonra yazdığımız şifreyi bir kez daha girmemizi isteyecek. Ardından da yeni kullanıcıya ait bazı detayları isteyecek. Hepsini doldurabilir ya da enter’a basarak geçebiliriz. En son bu bilgi doğru mu diye girdiğimiz bilgileri gösterip sorduğunda yine enter’a basarak işlemi tamamlıyoruz:

$ exit
$ sudo adduser psqladmin
Adding user `psqladmin' ...
Adding new group `psqladmin' (1001) ...
Adding new user `psqladmin' (1001) with group `psqladmin' ...
Creating home directory `/home/psqladmin' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for psqladmin
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]

Şimdi yeni kullanıcımızla giriş yapıp drupal kurulumumuzu taşıyacağımız postgresql veritabanını oluşturalım:

$ sudo -i -u psqladmin
$ psql
psqladmin=# CREATE DATABASE " psqladmin " WITH OWNER psqladmin ENCODING 'UTF-8' LC_COLLATE = 'tr_TR.UTF-8' LC_CTYPE = 'tr_TR.UTF-8' TEMPLATE template0;
CREATE DATABASE
psqladmin=# \q
$ exit

Böylece “drupal” isimli bir şema oluşturmuş olduk. Eğer “createdb: database creation failed: ERROR: invalid locale name: "tr_TR"” şeklinde bir hata alırsanız işletim sisteminizde Türkçe locale ayarlanmamış demektir. Bu durumda “sudo dpkg-reconfigure locales” komutuyla gelen listeden Türkçe’yi seçip iki kere OK dememiz lazım:

$ sudo dpkg-reconfigure locales
waiting

Bu işlemden sonra postgresql servisini “sudo service postgrsql restart” diyerek yeniden başatırsak veritabanımızı Türkçe collation ile oluşturabiliriz.

Şimdi sitemizin settings.php dosyasına bir ekleme yapacağız:

$ sudo nano /var/www/drupal/sites/default/settings.php

Settings.php içinde veritabanı bilgilerinin olduğu bölüme şu eklemeyi yapıyoruz:

$databases = array (
'default' => array (
'default' =>
array (
'database' => 'drupal',
'username' => 'drupal',
'password' => 'drupal',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
 ),
),
'dest' => array (
'default' =>
array (
'database' => ' psqladmin ',
'username' => ' psqladmin ',
'password' => ' psqladmin ',
'host' => 'localhost',
'port' =>'',
'driver' => 'pgsql',
'prefix' =>'',
   ),
  ),
 );

Eğer daha önce yapmadıysak PHP için postgresql driver’ını yüklememiz gerekiyor:

$ sudo apt install php7.0-pgsql

Henüz sitemizde hiçbir işlem yapmadık. Geçiş operasyonunu DBTNG Migrator isimli drupal modülü yardımıyla gerçekleştireceğiz. Bu modülü sayfasından diğer modülleri/eklentileri yüklediğimiz gibi yükleyip etkinleştiriyoruz.

waiting

Daha sonra modülün yönetim sayfasına SİTE/admin/structure/dbtng-migrator adresinden ulaştığımızda settings.php dosyasına girdiğimiz değerleri görebiliyoruz:

waiting

Taşınma işleminden önce tüm cache’leri temizlemekte fayda var. Migrate düğmesine bastığımızda mysql veritabanımızdaki tablolarımız ve bilgilerimiz postgresql’e aktarılacaktır.

waiting

Aktarımın doğru yapılıp yapılmadığını “Migrator Database Check” sekmesine tıkladıktan sonra “Check” yazan düğmeye tıklayarak yapabiliriz.

waiting

Aynı işlemi drush ile yapmak istersek:

$ drush cc all
'all' cache was cleared.
$ drush cc drush
'drush' cache was cleared.
$ drush dbtng-replicate default dest

komutlarını kullanabilirsiniz.

Son adım olarak tekrar settings.php dosyasını düzenliyoruz ve eski default veritabanı bilgileri yerine yeni veritabanımızı yazıyoruz:

$databases = array (
default => array (
'default' =>
array (
'database' => ' psqladmin ',
'username' => ' psqladmin ',
'password' => ' psqladmin ',
'host' => 'localhost',
'port' =>'',
'driver' => 'pgsql',
'prefix' =>'',
  ),
 ),
);

Not: Drupal otomatik tablo isimleri oluşturduğu için bazı tablo isimleri postgresql’e büyük gelebiliyor. Eğer aktarım sırasında hata alırsanız https://www.drupal.org/files/issues/drupal-998898-77.patch adresindeki patch’i uygulamalısınız.

https://www.drupal.org/node/1410102#comment-8431779
https://www.drupal.org/node/998898
https://www.drupal.org/files/issues/drupal-998898-77.patch