Kategori arşivi: SQL

pg_repack already has a trigger called “repack_trigger” Hatası ve Çözümü

Bu içeriğe sebep olan PostgreSQL üzerindeki hatamız aşağıdaki gibi pg_repack kullanıp bir tabloyu optimize etmek istediniz bellek taştı veya disk yetmedi geçici olarak süreç kendini öldürdüyse aşağıdaki gibi bir uyarı çıkar karşınıza. Ve işlemi devam ettirtmez.

INFO: repacking table "public.nodestore_node"
WARNING: the table "public.nodestore_node" already has a trigger called "repack_trigger"
DETAIL: The trigger was probably installed during a previous attempt to run pg_repack on the table which was interrupted and for some reason failed to clean up the temporary objects.  Please drop the trigger or drop and recreate the pg_repack extension altogether to remove all the temporary objects left over.
ShellScript

Ekli olan tetikleyicinin kaldırılması

DROP TRIGGER IF EXISTS repack_trigger ON public.nodestore_node;
ShellScript

Bu hata, pg_repack uzantısını kaldırmaya çalıştığınızda, uzantının hala bazı bağımlı nesnelere sahip olduğunu gösteriyor olacak ve hatamız şu şekilde

ERROR:  cannot drop extension pg_repack because other objects depend on it
DETAIL:  type repack.pk_21242 depends on schema repack
table repack.log_21242 depends on schema repack
ShellScript

Elle geçici tablosunun kaldırılması

DROP TABLE IF EXISTS repack.log_21242;
DROP TYPE IF EXISTS repack.pk_21242;
ShellScript

Eğer bu işe yaramazsa ki tablodaki çoğu tablo ve tip duruyor olabilir bu durumda aşağıdaki işinizi görür tümünü kaldırmanıza yardımcı olur.

DROP SCHEMA IF EXISTS repack CASCADE;
ShellScript

Ardından rahatlıkla eklentiyi kaldırabilirsiniz.

DROP EXTENSION pg_repack CASCADE;
ShellScript

Matomo Google Arşiv SiteID Düzeltme

Google Analytics kullandınız ve gün geldi benim gibi açık kaynaklı ve google’dan daha güzel veri sunan bir araca geçmek istediniz, Matomo bu noktada tam bir kurtarıcı ve oldukça güzel veriler sunuyor, ancak eski verilerinizi aktarma sırasında sitenizi kullanıyorken aktarım yapıyorsanız siteid değişiyor ve eski verileri göremiyorsunuz.

Bu noktada yapılacak çok basit bir şey var, eski verilerin olduğu tablolarda ID değişikliğine gitmek

UPDATE db_archive_blob_2016_01 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_01 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_01 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2016_02 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_02 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_02 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2016_03 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_03 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_03 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2016_04 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_04 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_04 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2016_05 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_05 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_05 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2016_06 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_06 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_06 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2016_07 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_07 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_07 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2016_08 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_08 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_08 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2016_09 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_09 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_09 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2016_10 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_10 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_10 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2016_11 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_11 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_11 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2016_12 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2016_12 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2016_12 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_01 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_01 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_01 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_02 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_02 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_02 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_03 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_03 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_03 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_04 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_04 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_04 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_05 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_05 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_05 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_06 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_06 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_06 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_07 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_07 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_07 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_08 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_08 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_08 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_09 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_09 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_09 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_10 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_10 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_10 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_11 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_11 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_11 SET idsite = 1 WHERE idsite = 4;

UPDATE db_archive_blob_2017_12 SET idsite = 1 WHERE idsite = 2;
UPDATE db_archive_blob_2017_12 SET idsite = 1 WHERE idsite = 3;
UPDATE db_archive_blob_2017_12 SET idsite = 1 WHERE idsite = 4;

Ardından arşivinizi web sitesi üzerinde görebilirsiniz.

ERROR 1298 (HY000): Unknown or incorrect time zone: ‘UTC’ Hatası ve Çözümü

Yeni bir uygulama için MySQL üzerinde veritabanı oluşturdum. Direk olarak SQL komutlarını veritabanına yazdırmak ve gerekli veriyi yüklemem gerekiyordu lakin aşağıdaki hata ile karşılaştım.

"ERROR 1298 (HY000): Unknown or incorrect time zone: 'UTC'"?

Bahsi geçen bu hatanın çözümü İnternet ortamında hep aynı noktaya çıkarttı beni, Olayın özüne pek inemedim ama sorunu kolay bir şekilde aşağıdaki komut aracılığı ile çözümledim.

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p

Unknown/unsupported storage engine: InnoDB Sorununun Çözümü

8 Ekim tarihinde yaklaşık 20 ila 30 dakika arasında bir kesinti yaşamıştık. Bu kesintiye sebep olan MariaDB kardeşimizde bulunan bir sorundu, bahsi geçen sorun şu şekildeydi

[ERROR] Plugin ‘InnoDB’ init function returned error.
[ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
[ERROR] Unknown/unsupported storage engine: InnoDB
[ERROR] Aborting

Bu hataya sebep olan durumun ne olduğu konusunda en ufak bir fikrim yok, çünkü rutin bir güncelleme ve yeniden başlatma sekansıyla birlikte ortaya çıkan bir durumdu bu

Önce mysqlin tmp klasör dizinini değiştirdim.

[mysqld]
tmpdir = /tmp/

Ardından loglarda senkron sorunu olabileceği google sonuçlarında ve çoğu belgede yazdığı için 2 adet geçici dosyayı kaldırdım

rm /var/lib/mysql/ib_logfile0
rm /var/lib/mysql/ib_logfile1

Hemen ardından, servisleri tekrar başlattım böylelikle sorun ortadan kalkmış oldu.

PostgreSQL’de id Alanlarında UUID Kullanımı

Django kullanım sırasında id alanlarını normal sayı yerine UUID ile değiştirmek istediğinizde SQLite üzerinde herhangi bir hata ile karşılaşmazsınız ama iş PostgreSQL kullanmaya gelince ortalık itinayla karışacaktır. Özellikle daha önceden bu alanlarda id kullanıyorsanız. Daha sonra değiştirmeye kalktığınızda haliyle aşağıdaki hata sizi karşılayacak.

Aşağıdaki hata karşınıza çıkması muhtemel

django.db.utils.ProgrammingError: cannot cast type integer to uuid
LINE 1: ...BLE "news_news" ALTER COLUMN "id" TYPE uuid USING "id"::uuid

Çözüm olarak ise aşağıdaki adımları uygulayınız.

ALTER TABLE news_news ALTER COLUMN id DROP DEFAULT;
CREATE EXTENSION "uuid-ossp";
ALTER TABLE news_news ALTER COLUMN id SET DATA TYPE UUID USING uuid_generate_v4();

Sorun çözüldü, migrations dosyanızı yeniden oluşturmanız gerektiğini belirteyim, yukarıdaki hata tip çevirimlerinden kaynaklanmaktadır.

PostgreSQL Veritabanını Yedekten Geri Yükleme

Bir veritabanını geri yüklemeden önce, o veritabanına olan tüm bağlantıları sonlandırmanız ve yedekleme dosyasını hazırlamanız gerekir. PostgreSQL’te bir veritabanını iki şekilde geri yükleyebilirsiniz:

  • Psql kullanarak, pg_dump ve pg_dumpall araçları tarafından üretilen düz SQL komut dosyasını geri yüklemek
  • Pg_dump aracıyla oluşturulan tar dosyası ve dizin biçimini geri yüklemek için pg_restore kullanmak

Psql kullanarak veritabanlarını geri yükleme

Psql yardımcı programı, pg_dump, pg_dumpall veya uyumlu yedek dosyalar üreten diğer araçlar tarafından oluşturulan SQL komut dosyasını geri yüklemenizi sağlar. Psql aracını kullanarak tüm komut dosyasını yürütmeniz gerekir.

Tam olan bir yedeklemeyi geri yüklemek ve geri yükleme işlemi sırasında oluşan herhangi bir hatayı göz ardı etmek için aşağıdaki komutu kullanabilirsiniz

psql -U kullanici-adi -f yedek.sql

Bir hata oluşması durumunda veritabanını geri yüklemeyi durdurmak isterseniz aşağıdaki komutu kullanmanız gerekiyor benimde en çok kullandığım yöntem budur

psql -U kullanici-adi --set ON_ERROR_STOP=on -f yedek

Gördüğünüz gibi sadece ek bir seçenek ekledik. --set ON_ERROR_STOP = on

Belli bir veritabanın da ki belirli veritabanı nesnelerini yedeklerseniz, bunları aşağıdaki komutu kullanarak geri yükleyebilirsiniz

psql -U kullanici-adi -d veritabani -f yedekbro.sql

Pg_restore kullanarak veritabanları nasıl restore edilir

Psqltool’un yanında, pg_dump veya pg_dumpalltools tarafından yedeklenen veritabanlarını geri yüklemek için pg_restore programını kullanabilirsiniz. Pg_restore programı ile, restorasyon edilecek veritabanları için çeşitli seçenekler bulunuyor bunları şu şekilde sıralayabiliriz.

  • Pg_restore, restorasyon için iş parçacığı sayısını belirtmek için -j seçeneğini kullanarak paralel geri yükleme yapmanıza izin verir. Her bir thread aynı anda ayrı bir tabloyu geri yükler ve böylece işlem oldukça hızlanır. Şu anda, pg_restore yalnızca özel dosya biçimi için bu seçeneği desteklemektedir.
  • Pg_restore, belirli veritabanı nesnelerini tam veritabanını içeren bir yedeği geri yüklemenizi sağlar.
  • Pg_restore, eski sürümde yedeklenen bir veritabanını alabilir ve yeni sürüme geri yükleyebilir.
pg_restore --dbname=cemil --verbose /home/mertcan/yedek.tar

İkincisi, aşağıdaki komutu kullanarak tablo yapısını yalnızca yedek.tar yedek dosyasından geri yükleyebiliriz.

pg_restore --dbname=cemil --section=pre-data  /home/mertcan/yedek.tar

Temel MYSQL Komutları

Yaklaşık olarak 9 ay önce MySQL için hazırlanmış olan temel komut ve kısayolları içermektedir. Giriş seviyesinde öğrenmeniz gereken her şey bulunmaktadır. Okullarda hocaların genel olarak üzerinde durdukları konulara göre düzenlenmiştir.

Ayrıca Github üzerinden bulabilir. Örnek veritabanlarına ulaşabilirsiniz.

Ulaşmak İçin Tıklayın

Veritabanı ile bağlantı kurma

Local sunucuda kurulu olan MySQL komut satırı aracılığı ile bağlanabilmek için aşağıdaki komutu kullanmanız yeterlidir.

mysql -u root -h 127.0.0.1

Mevcut Veritabanlarını Listeleme

Aşağıdaki komut aracılığı ile veritabanındaki mevcut veritabalarını listeleyebilirsiniz.

SHOW DATABASES;

Veritabanı Oluşturma

Aşağıdaki komut aracılığı ile istediğiniz bir isim ile veritabanı oluşturabilirsiniz.

CREATE DATABASE [veritabanıadı];

Oluşturulan Veritabanını Kullanma

Aşağıdaki komut aracılığı ile oluşturulan veritabanı içerisinde istediğiniz komutları kullanma imkanı tanınır.

USE [veritabanıadı];

Tablo Oluşturma

Aşağıdaki komutu kullanarak veritabanı içerisinde tablo oluşturabilirsiniz.

CREATE TABLE [tabloadı] ([kolon] VARCHAR(120), [birsonrakikolon] DATETIME);

Tabloları Gösterme

Veritabanı içerisinde oluştruduğunuz veya varolan tabloları göstermeye yarar.

SHOW TABLES;

Tablo Detaylandırma

Veritabanı içerisindeki tabloları ve bu tablolara ait olan değerlerin tanımlamalarını göstermektedir.

DESCRIBE [tabloadı];

Tabloya Veri Ekleme

Veritabanı içerisinde bulunan herhangi bir tabloya veri girişine imkan tanır.

INSERT INTO [tabloadı] ([kolon], [birsonrakikolon]) VALUES ('[deger1]', [deger2]');

Tabloya kolon Ekleme

Veritabanı içerisinde bulunan ve seçtiğiniz tabloya kolon eklenilmesine imkan verir.

ALTER TABLE [tabloadı] ADD COLUMN [kolon] VARCHAR(120);

Veritabanı içerisinde benzersiz kimlikli ve otomatik artan kolonlar oluşturmanıza imkan tanır.

ALTER TABLE [table] ADD COLUMN [column] int NOT NULL AUTO_INCREMENT PRIMARY KEY;

SQL İfadeleri


Tablodaki Kayıtları Gösterme

Veritabanı içerisinde bulunan tablolar içerisindeki kayıtları ekrana getirir.

SELECT * FROM [tabloadı];

Veritabanında bulunan tablolar içerisinde ki kayıtları parça parça ekrana getirirmenize olanak sağlar

SELECT [kolon], [birsonrakikolon] FROM [tabloadı];

Tablodaki Kayıtların Sayısını Gösterme

Tablo içerisinde belirtilen kolona ait kaç adet kayıt olduğunu gösterir

SELECT COUNT([kolon]) FROM [tabloadı];

Tablodaki Kayıtları Sayma ve gruplandırılmış kayıtları seçme

Kayıtları sayar ve gruplandırılmış bir şekilde kayıtları gösterir.

SELECT *, (SELECT COUNT([kolon]) FROM [tabloadı]) AS count FROM [tabloadı] GROUP BY [kolon];

İçeren kayıtları getir

SELECT * FROM [tabloadı] WHERE [kolon] LIKE '%[deger]%';

[deger] ile başlayanları getir

SELECT * FROM [tabloadı] WHERE [kolon] LIKE '[deger]%';

deg ile başlayan ve er ile bitenleri getir

SELECT * FROM [tabloadı] WHERE [kolon] LIKE '[deg_er]';

Bir Aralık Seçme

SELECT * FROM [tabloadı] WHERE [kolon] BETWEEN [deger1] and [deger2];

Özel Sırayla ve Limitli Bir Şekilde Seçim

SELECT * FROM [tabloadı] WHERE [kolon] ORDER BY [kolon] ASC LIMIT [deger];

Kayıt Güncelleme

UPDATE [tabloadı] SET [kolon] = '[guncellenencek-deger]' WHERE [kolon] = [deger];

Kayıt Silme

DELETE FROM [tabloadı] WHERE [kolon] = [deger];

Tablonun kolonunu silme

ALTER TABLE [tabloadı] DROP COLUMN [kolon];

Tablo silme

DROP TABLE [tabloadı];

Veritabanı Silme

DROP DATABASE [veritabanıadı];

Özel Kolon isimleri tanımlama

SELECT [kolon] AS [özel-kolon-adı] FROM [tabloadı];

Veritabanının Yedeğini Alma

mysqldump -u [kullanıcıadı] -p [veritabanıadı] > yedekadi.sql

Veritabanının Yedeğini Yükleme

mysql -u [kullanıcıadı] -p -h localhost [veritabanıadı] < yedekadi.sql

Matematiksel Fonksiyonlar


Yineleme Olmadan Seçim

SELECT distinct name, email, acception FROM owners WHERE acception = 1 AND date >= 2015-01-01 00:00:00

Kayıtların Toplam Sayısını Hesaplama

SELECT SUM([kolon]) FROM [tabloadı];

Toplam [sütun] sayısını alma ve grublama [ara kolonlu]

SELECT [arakolon], SUM([kolon]) FROM [tablo] GROUP BY [arakolon];

Kolondaki en büyük değer

SELECT MAX([kolon]) FROM [tabloadı];

Kolondaki en küçük değer

SELECT MIN([kolon]) FROM [tabloadı];

Kolon Ortalaması

SELECT AVG([kolon]) FROM [tabloadı];

Yuvarlanmış ortalama değer ile gruplama

SELECT [carakolon], ROUND(AVG([kolon]), 2) FROM [tabloadı] GROUP BY [arakolon];

Kullanıcı Komutları


Kullanıcı Oluşturma

CREATE USER 'kullanıcı_adı'@'localhost' IDENTIFIED BY 'şifresi';

Kullanıcı Yetkilendirme

GRANT ALL PRIVILEGES ON * . * TO 'kullanıcı_adi'@'localhost';

veya

GRANT ALL ON veritabanı_adı.* TO 'kullanıcı_adı'@'localhost';

PostgreSQL Komut ve Kısayolları

PosgreSQL ile uğraşırken kurcaladıklarım ve öğrendiklerim oldu unutmak istemediğimden bende bir referans kartı oluşturmaya karar verdim. Bir kaç projede kullandım pekiştirme fırsatı buldum. Denedim çalışma mantığını gözlemledim güzelliklerini gördüm oldukça hoşuma gitti

Girişimizi yapalım postgres kullanıcısı ile

sudo -u postgres psql postgres

daha sonra postgres=# olarak konsolda görebileceksiniz aşağıdaki komutları çalıştırmanız yeterli

KomutAçıklama
qÇıkış
conninfoveritabanı bağlantı bilgisi
c [veritabani]Veritabanı bağlantısı
d+ [tabloadi]Tablonun tanımı
dt *.*Tüm veritabanındaki tabloları gösterir
lVeritabanlarını listeler
l+Veritabanlarını detaylı listeler
dnŞemalar listelenir
dfFonksiyonlar listelenir
dvİlişkiler listelenir
df+Fonksiyon’un detayları
xÇıktıları güzelleştirir.(önerilir)
dx+Eklentileri listeler
encodingTanımlı olan karakter kodlaması
duKuralları listeler

PostgreSQL Servislerinde yapılabilecekler

sudo service postgresql stop
sudo service postgresql start
sudo service postgresql restart

Yeni kural oluşturma

CREATE ROLE kural1 WITH LOGIN ENCRYPTED PASSWORD 'sifre' CREATEDB;

Sadece kural seti olarak veritabanı oluşturmaya izin verdik diğer kurallar için durum şu şekilde;

CREATE ROLE kural1 WITH LOGIN ENCRYPTED PASSWORD 'sifre1' CREATEDB CREATEROLE REPLICATION SUPERUSER;

Çalıştırma planı

EXPLAIN SELECT * FROM pg_class;

Çalışma zamanı parametreleri

SHOW ALL;

tanımlanan kuralı silme

DROP ROLE kural1;

Veritabanı oluşturma

CREATE DATABASE test_db WITH OWNER kural1 ENCODING 'UTF8';

Yetkilendirme

GRANT ALL PRIVILEGES ON DATABASE test_db TO kural1

Veritabanını silme

DROP DATABASE test_db;

Tablo oluşturmak

CREATE TABLE tablo_adi (
 id serial PRIMARY KEY,
 name varchar(20) UNIQUE NOT NULL,
 dateCreated timestamp DEFAULT current_timestamp
);

Birincil anahtar ekleme

ALTER TABLE tablo_adi ADD PRIMARY KEY (id);

indis oluşturmak

CREATE UNIQUE INDEX indexName ON tableName (columnNames);

ilk 10 kayıt

SELECT satır FROM tablo LIMIT 10;

regexp kullanarak kayıt getirme

SELECT satır FROM tablo WHERE column ~ 'test.*';

sayfalayarak kayıtları getirme

SELECT cols FROM table LIMIT 10 OFFSET 30;

tablodaki tüm kayıtları getir

SELECT * FROM tablo;

yeni kayıt girme

INSERT INTO tablo (satır1,satır2) VALUES (4, 'testveri');

satır güncelleme

UPDATE tablo SET test = 'test2' WHERE id = 4;

kayıt silme

DELETE FROM tablo WHERE id = 4;

Lag replication kontrol

SELECT EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp()))::INT;

Devam eden sorguların kontrolü

SELECT datname,usename,client_addr,waiting,query_start FROM pg_stat_activity WHERE query_start < NOW() + INTERVAL '5 seconds';

En büyük boyutlu veritabanı tablosunu bulma

SELECT table_name, pg_relation_size(table_name) FROM information_schema.tables WHERE table_schema = 'public' ORDER BY 2;

Veri bekleyen tüm sorgular

SELECT * FROM pg_stat_activity WHERE waiting='t';

Veritabanı toplam boyutu

SELECT pg_size_pretty(pg_database_size('veritabanı_adı'));

Komut Satırı ile MySQL Kullanıcı Oluşturma

Web Serveri kurduğunuzu varsayıyorum ve veritabanınıza kullanıcı eklemeniz gerekiyor. Panel yada herhangi bir arayüz kullanmadığınızı düşünelim mysql veritabanında kullanıcı oluşturmanız oldukça zor geliyor olabilir. Zor bir yanı yok aşağıdaki komutları uygulayarak kolaylıkla veritabanınıza kullanıcı ataması yapabilirsiniz.

MySQL root olarak giriş yapalım

mysql-u root -p

Aşağıdaki komutları oluşturacağınız kullanıcıya düzenleyebilirsiniz.

create database database_name;
CREATE USER 'database_user'@'localhost' IDENTIFIED BY 'database_password';
GRANT ALL PRIVILEGES ON * . * TO 'database_user'@'localhost';
FLUSH PRIVILEGES;
exit

VestaCP’de Mysql Sorununun Çözülmesi

VestaCP kullanan sistemlerinde genelde 512 MB yada 1 GB ram barındıran VPS sunucularının temel sorunlarından bir tanesi mysql pidlerinin kendi kendilerini kapatmasıdır. Özellikle tam bir işlem yaparken yada durduk yere kendisini kapatmaktadır.

Buda sistemin yetersiz kalmasından kaynaklandığını bir kaç kişiye kurulum yaptığımda fark ettim gereksiz yere fazla pid açıyor yada gereksiz yere mysql çalıştırıyordu. Bir kaç haftalık çalışmadan sonra en iyi yapılandırmayı bulabildim.

Denediğim 4 adet sistemde de mysql pidleri bir daha kendini kapatmadığını fark ettim. Çok az sistem kaynağı olan siteler için aşağıdaki my.cnf kullanabilirsiniz. Bunlar dışında bir önceki makalemizde yayınladığımız ayarları da kullanabilirsiniz.

Bunlardan ilki 512 MB rami olan sistemler için;

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
max_connections=100
max_user_connections=30
wait_timeout=30
interactive_timeout=50
slow-query-log =1
long_query_time=5
slow-query-log-file = /var/log/mysql-slow.log

skip-external-locking
key_buffer_size = 8M
max_allowed_packet = 16M
table_open_cache = 4k
sort_buffer_size = 512k
read_buffer_size = 512k
read_rnd_buffer_size = 512k
myisam_sort_buffer_size = 8M
thread_cache_size = 128
query_cache_size = 8M
query_cache_limit = 8M
tmp_table_size = 16M
max_heap_table_size = 16M
join_buffer_size = 512k

innodb_file_per_table
innodb_buffer_pool_size = 8M

[mysqld_safe]
log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid 

Bir diğeri ise 1 GB ramı olan sistemler içindir;

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
max_connections=70
max_user_connections=30
wait_timeout=10
interactive_timeout=50
long_query_time=5
slow_query_log=0

key_buffer = 128M
myisam_sort_buffer_size = 32M
join_buffer_size=1M
read_buffer_size=1M
sort_buffer_size=2M
table_cache=1536
thread_cache_size=286
interactive_timeout=25
connect_timeout=5
max_allowed_packet=32M
max_connect_errors=1000
query_cache_limit=1M
query_cache_size=32M
query_cache_type=1
tmp_table_size=64M
max_heap_table_size=64MB

innodb_buffer_pool_size=32M
innodb_flush_log_at_trx_commit=2
innodb_file_per_table

[mysqld_safe]
log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid 

yapılan testler sonucunda verimli olduğu kararlaştırılmıştır. Sisteminizde oluşabilecek sorunlara karşı lütfen orjinal my.cnf dosyasını saklamayı unutmayınız. Ayrıca yukarıdaki ayarları yaptınız ama gene aynı sorun ile karşılaşıyorsanız lütfen iletişime geçin yada konu altına yorum yapabilirsiniz.

MySQL Veritabanı Yedekleme Scripti

Sunucunuzda kullanabileceğiniz oldukça kullanışlı bir script’dir. Mysql ve MariaDB(percona dahil) pek çok sistemin yedeğini kolaylıkla alabilirsiniz.

Yedeği alırken sistemde ön tanımlı olarak gelen veritabanlarını dahil etmez. Yedekler alınırken de tarih ve zamana göre tutulurlar isterseniz günlük isterseniz haftalık bir şekilde yedeklerinizi alabilirsiniz tabi bunu gerçekleştirmek için crontab özelliğini kullanmanız gerekiyor.

parolaniz yazan kısmı doldurmayı ihmal etmeyin. Sonrasında dosyamızı oluşturalım ve çalıştıralım.

#! /bin/bash

TIMESTAMP=$(date +"%F")
BACKUP_DIR="/backup/$TIMESTAMP"
MYSQL_USER="root"
MYSQL=/usr/bin/mysql
MYSQL_PASSWORD="parolaniz"
MYSQLDUMP=/usr/bin/mysqldump

mkdir -p $BACKUP_DIR/mysql

databases=`mysql --no-defaults --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`

for db in $databases; do
        if [$db != "performance_schema"]&&[$db != "mysql"];then
                echo -e "Backing up: '$db' to $BACKUP_DIR/mysql/$db.sql n"
                ##uncomment to enable gzip
                #$MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
                ##comment to enable gzip
                $MYSQLDUMP --no-defaults --force --opt --user=$MYSQL_USER --password=$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
        fi
done

Dosyayı oluşturmak için

cd /usr/local/bin
nano sqlbackup.sh
chmod +x sqlbackup.sh

Sonrasında oluşturulan dosyayı çalıştırmak için aşağıdaki komutu veriniz.

./sqlbackup.sh