46
PostgreSQL PostgreSQL Hem Güçü Hem Güzel! Hem Güçü Hem Güzel! 6 Mayıs 2015 Van Yüzüncü Yıl Üniversitesi Bili ş im Ş enli ğ i 2015 Gülçin Yıldırım

PostgreSQL Hem Güçlü Hem Güzel!

Embed Size (px)

Citation preview

Page 1: PostgreSQL Hem Güçlü Hem Güzel!

PostgreSQLPostgreSQL Hem Güçü Hem Güzel!Hem Güçü Hem Güzel!

6 Mayıs 2015 Van Yüzüncü Yıl Üniversitesi Bilişim Şenliği 2015

Gülçin Yıldırım

Page 2: PostgreSQL Hem Güçlü Hem Güzel!

Ben Kimim?Ben Kimim?

DBA @ DBA @ Blogger @ Blogger @ MarkafoniMarkafoni Kadın YazılımcıKadın Yazılımcı Twitter: Twitter: @apatheticmagpie@apatheticmagpie

Page 3: PostgreSQL Hem Güçlü Hem Güzel!

PostgreSQL TarihiPostgreSQL Tarihi

University of California at Berkeley (UCB) 1977.

Michael Stonebraker Ingres Projesi'ni başlattı.

Page 4: PostgreSQL Hem Güçlü Hem Güzel!

PostgreSQL Çok Güçlü!PostgreSQL Çok Güçlü!

Dünyanın en gelişmiş açık kaynak kodlu veri tabanıdır.İlişkisel bir veri tabanı yönetim sistemidir ( )Çok büyük verileri ve anlık işlem yükü yüksek olan projeleriPostgreSQL ile yönetmek mümkündür.

ORDBMS

Page 5: PostgreSQL Hem Güçlü Hem Güzel!

PostgreSQL Çok GüçlüPostgreSQL Çok GüçlüGüçlü, sağlam, ACID prensiplerine uygun, hata yapmayaengel olan güvenli bir yapısı vardır.Aktif bir topluluk tarafından desteklenmektedir.PostgreSQL için çok fazla eklenti/araç geliştirilmektedir.PostgreSQL belge ve dokümantasyon olarak iyidir.SQL Standartlarına en çok uyum gösteren veri tabanıdır.Sorgu planlayıcısı harikadır!Performans iyileştirmek için idealdir.Hata mesajları ve log sistemi açıktır, anlaşılırdır.Replikasyon metodları zengindir.Yönetimi kolaydır.

Page 6: PostgreSQL Hem Güçlü Hem Güzel!

PostgreSQL ÖğrenmekPostgreSQL ÖğrenmekPostgres kaydolun. Günde 1 mail ile ne kadar

çok şey öğrenebileceğinize inanamazsınız.mail listelerine

Liste TanımıPostgreSQL yönetimiKullanıcılar için genel bir tartışmaalanıPostgres ve ona bağlı servisduyurularıPostgres performansına ilişkinkonular

pgsql-adminpgsql-general

psql-announce

psql-performance

Page 7: PostgreSQL Hem Güçlü Hem Güzel!

PostgreSQL ÖğrenmekPostgreSQL Öğrenmek blogunu takip edin.

( , , , , , , , , , )

Planet PostgreSQL2ndQuadrant pgExperts VMware OmniTI EnterpriseDB

EndPoint credativ Cybertec CommandPrompt OpenSCG

PostgreSQL bloglarının tümü bu blogda toplanır.

Page 8: PostgreSQL Hem Güçlü Hem Güzel!

PostgreSQL ÖğrenmekPostgreSQL Öğrenmek

Karşılaştığınız her konsept için yazılmış bulup okuyun.

Postgres belgeleme konusunda en zengin açık kaynak kodluprojelerden biridir.Çok sık kullandığınız özellikleri bile okuyun çünkü ufak birdetay hayat kurtarıcı olabilir.

PostgreSQLbelgesini

"Why do I love Postgres?- Because I'm not a DBA. "

Page 9: PostgreSQL Hem Güçlü Hem Güzel!

Postgres Neden Güzel?Postgres Neden Güzel?

Page 10: PostgreSQL Hem Güçlü Hem Güzel!

Kurulumu Çok KolayKurulumu Çok KolayMac

basit ve 'native' bir Mac OS X uygulaması veyükleyiciye gerek duymuyor. Uygulamayı açtığınızda yeni

bağlantılara açık bir PostreSQL sunucu hazır oluyor.Uygulamayı kapadığınızda sunucu kapanıyor.

Postgres.app

Linuxapt-get install postgresql-9.3

yum install postgresql-server

service postgresql initdb

chkconfig postgresql on

(Debian)

(Red Hat ailesi)

WindowsWindow ile yüklemek için linki inceleyiniz.

Page 11: PostgreSQL Hem Güçlü Hem Güzel!

pgAdmin pgAdmin Postgres'in grafik arayüzüdür. Sorgu analiz etme, çalışan

sorguları gözlemleme özellikleri mevcuttur. Kullandığınızözelliklerin kodlarını görebilir, değiştirebilir ve

düzenleyebilirsiniz.

Page 12: PostgreSQL Hem Güçlü Hem Güzel!

pgAdminpgAdmin

Page 13: PostgreSQL Hem Güçlü Hem Güzel!

Postgres Çok GüzelPostgres Çok GüzelParçalı dizin ( ) kullanımıpartial indexes

Create index index_1 on conference (presentation_id) where isactive = true;Create unique index tests_success_constraint on tests (subject, target) where success;

Fonksiyonel dizin ( ) kullanımıindexes on expressionsCreate index concurrently index_2 on users to_lower(email);

Şema ( )SchemasCreate schema womentechmakers;

TablespacesCreate tablespace women location '/data/women';

Create index concurrently ariteknokent_idx on conference (speaker_id) tablespace women;

Page 14: PostgreSQL Hem Güçlü Hem Güzel!

Postgres Çok GüzelPostgres Çok Güzel , , ( )ACID Savepoint PITR WAL

harika! , , modülü (Key/Value çiftleri)

Veri bölümleme ( ), ( )

, (with, with recursive) , modülü

, , ve ,

Rollback to savepoint my_svp;Release savepoint my_svp;

Sorgu planlayıcısıEnum tipi Boolean tipi Hstore

Partitioning InheritanceHA, Load Balancing & Replication Hot StandbyWindow Functions CTE

Gin & Gist dizin (index) tipleri pg_trgmFull Text Search Sequence

Arrays XML tipi XML fonksyionları UUID tipi

Page 15: PostgreSQL Hem Güçlü Hem Güzel!

PostgreSQL vs MySQLPostgreSQL vs MySQL

"One of the nice things about Postgres is that ittries very hard to get you to do the right thing.

MySQL doesn't care as much."

Page 16: PostgreSQL Hem Güçlü Hem Güzel!

Farklar ile ÖğrenmeFarklar ile Öğrenme

Page 17: PostgreSQL Hem Güçlü Hem Güzel!

User vs RoleUser vs RoleCreate user devfest with password 'i<3postgres!';

Fark, 'user' olarak yarattığımızda 'login' özelliği olan bir 'role'yaratıyor olmamız; 'role' yarattığımızda 'login' olabilmesi için

onu rolü yaratırken belirtmek gerekir.Create role devfestw with password 'i<3linux!'

Create role devfestwomen with password 'i<3linux!' login;

gulcin=# \duList of rolesRole name | Attributes | Member of-------------+------------------+--------------devfest | | {} devfestw | Cannot login | {}devfestwomen | | {}

Page 18: PostgreSQL Hem Güçlü Hem Güzel!

Nelere Bakmalıyım?Nelere Bakmalıyım?Bu rolleri nasıl yetkilendirebilirim?

Hepsini topluca yetkilendirsem güzel olmaz mı?gulcin=# Create role gdg;CREATE ROLEgulcin=# Grant gdg to devfest;GRANT ROLEgulcin=# Grant gdg to devfestw;GRANT ROLEgulcin=# Grant gdg to devfestwomen;GRANT ROLE

gulcin=# \duList of rolesRole name | Attributes | Member of-------------+------------------+--------------devfest | | {gdg} devfestw | Cannot login | {gdg}devfestwomen | | {gdg} gdg | Cannot login | {}

Page 19: PostgreSQL Hem Güçlü Hem Güzel!

Nelere Bakmalıyım?Nelere Bakmalıyım? Create role gdg option;

SUPERUSER NOSUPERUSERCREATEDB NOCREATEDBCREATEROLE KNOCREATEROLECREATEUSER NOCREATEUSERINHERIT NOINHERITLOGIN NOLOGINREPLICATION NOREPLICATION

Page 20: PostgreSQL Hem Güçlü Hem Güzel!

Nelere Bakmalıyım?Nelere Bakmalıyım?Yetkilendirdim, nasıl geri alırım?

gulcin=# Alter role gdg superuser;ALTER ROLE

gulcin=# \duList of rolesRole name | Attributes | Member of-------------+-------------------------+------------gdg | Superuser, Cannot login | {}

gulcin=# Alter role gdg nosuperuser;ALTER ROLE

gulcin=# \duList of rolesRole name | Attributes | Member of-------------+-------------------------+------------gdg | Cannot login | {}

Page 21: PostgreSQL Hem Güçlü Hem Güzel!

Nelere Bakmalıyım?Nelere Bakmalıyım?Tabloları, sıralı dizileri, fonksiyonları, dizinleri nasıl

yetkilendirebilirim?Verdiğim yetkileri nasıl geri alabilirim?

Grant select,update on table table_1 to gdg;Grant insert on all tables in schema public to devfestwomen;Grant usage on table_1_id_seq to devfestw;Grant select on all sequences in schema google to devfest;

Revoke select,update on table table_1 from gdg;Revoke insert on all tables in schema public from devfestwomen;Revoke usage on table_1_id_seq from devfestw;Revoke select on all tables in schema google from devfest;

Şema kullanımını da öğreneyim o zaman.

Page 22: PostgreSQL Hem Güçlü Hem Güzel!

Explain vs Explain Analyze Explain vs Explain Analyzegulcin=# explain select * from table_1; QUERY PLAN------------------------------------------------------------------ Seq Scan on table_1 (cost=0.00..4740.30 rows=86430 width=140)(1 row)

gulcin=# explain analyze select * from table_1; QUERY PLAN------------------------------------------------------------------- Seq Scan on table_1 (cost=0.00..4740.30 rows=86430 width=140) (actual time=0.274..35.983 rows=86430 loops=1) Total runtime: 40.492 ms(2 rows)

Begin;Explain analyze delete from table_1; Rollback;

Explain (format JSON) select * from table_1;

Page 23: PostgreSQL Hem Güçlü Hem Güzel!

Farklar ile ÖğrenmeFarklar ile ÖğrenmeKonseptlerin ortak yönlerini, kullanım amaçlarını,

birbirlerinden ayrıldıkları noktaları bulmak detayı görmenizeyardım edecektir.

Bu farkları bulmakla devam edebilirsiniz.

Page 24: PostgreSQL Hem Güçlü Hem Güzel!

Postgres'i AnlamakPostgres'i Anlamak"When elephants fight it is the grass that

suffers."

"Filler dövüşür çimenler ezilir."

Page 25: PostgreSQL Hem Güçlü Hem Güzel!

Postgres'i AnlamakPostgres'i AnlamakUzun uzuuuun log incelemektir.

tail -f postgresql-Fri.log | perl -pe 's/.*ERROR.*/\e[1;31m$&\e[0m/g'

Page 26: PostgreSQL Hem Güçlü Hem Güzel!

Postgres'i AnlamakPostgres'i AnlamakPostgres eklentisi kurmak istedik. Belge bize ne önerdi?

Select * from pg_available_extensions;Select * from pg_available_extension_versions;

gulcin=# Create extension pg_stat_statements;CREATE EXTENSIONgulcin=# Select * from pg_stat_statements;ERROR: pg_stat_statements must be loaded via shared_preload_libraries

gulcin=# Show config_file; config_file----------------------------------------- /var/lib/pgsql/9.2/data/postgresql.conf(1 row)

gulcin=# vim /var/lib/pgsql/9.2/data/postgresql.conf

#---------------------------------------# RESOURCE USAGE (except WAL)#---------------------------------------# - Memory -shared_preload_libraries ='pg_stat_statements'#(change requires restart)

Page 27: PostgreSQL Hem Güçlü Hem Güzel!

Loglara bakarım, yetkilerini alırım. Kaldırırım.

Postgres'i AnlamakPostgres'i AnlamakDiyelim ki bir tabloyu kaldırmak istedik...

gulcin=# select * from pg_stat_all_tables where relname = 'table_1';-[ RECORD 1 ]-----+-------------------------------------------------relid | 28193schemaname | publicrelname | table_1seq_scan | 30686799 /* okuma ile ilgili parametreler */seq_tup_read | 28979969846 /* okuma ile ilgili parametreler */idx_scan | 2541503146 /* okuma ile ilgili parametreler */idx_tup_fetch | 1119955873 /* okuma ile ilgili parametreler */n_tup_ins | 129 /* kaç kayıt eklenmiş */n_tup_upd | 123199 /* kaç kayıt güncellenmiş */n_tup_del | 0 /* kaç kayıt silinmiş */n_tup_hot_upd | 122323n_live_tup | 1011n_dead_tup | 58last_vacuum | 2014-03-01 06:03:44.979917+02last_autovacuum | 2014-03-01 17:08:39.960498+02last_analyze | 2014-03-01 06:03:45.003016+02last_autoanalyze | 2014-03-01 17:15:39.937703+02vacuum_count | 184autovacuum_count | 591analyze_count | 185autoanalyze_count | 754

gulcin=# select * from pg_stat_statements where query like '%table_1%'; (No rows)

Page 28: PostgreSQL Hem Güçlü Hem Güzel!

Postgres'i AnlamakPostgres'i AnlamakKonfigürasyon parametrelerini anlamaktır.

Loglara bakabilmek için log parametrelerini doğru ayarlamakgerek.

Where, When, What to Log #-------------------------------------------------# ERROR REPORTING AND LOGGING#-------------------------------------------------

# - Where to Log -

log_destination = 'stderr'logging_collector = onlog_directory = 'pg_log' log_filename = 'postgresql-%a.log'log_truncate_on_rotation = on log_rotation_age = 1d log_rotation_size = 0

# - When to Log -

log_min_duration_statement = 500

Page 29: PostgreSQL Hem Güçlü Hem Güzel!

Postgres'i AnlamakPostgres'i Anlamak#----------------------------------------------# RUNTIME STATISTICS#-----------------------------------------------# - Query/Index Statistics Collector -track_activities = ontrack_counts = ontrack_functions = pl # none, pl, all

Konfigürasyon dosyasındaki bu parametreler sunucuçapındaki koleksiyon özelliklerini kontrol eder. İstatistik

toplama açık ise, üretilen veri pg_stat ve pg_statio ailesindeki(pg_stat_activity, pg_stat_database, pg_statio_all_indexes)

sistem tabloları tarafından erişilebilir.

Page 30: PostgreSQL Hem Güçlü Hem Güzel!

Postgres'i AnlamakPostgres'i AnlamakKilitleri görmek ve yönetmektir.

SELECT pg_stat_activity.datname, pg_class.relname, pg_locks.mode, pg_locks.granted, pg_stat_activity.usename, substr(pg_stat_activity.query,1,10), pg_stat_activity.query_start, age(now(),pg_stat_activity.query_start) AS "age", pg_stat_activity.pidFROM pg_stat_activity, pg_locksLEFTOUTER JOIN pg_class ON (pg_locks.relation = pg_class.oid)WHERE pg_locks.pid=pg_stat_activity.pid AND MODE LIKE 'Exclusive%' AND datname= 'warehouse'ORDER BY query_start;

Select * from pg_stat_activity where pid = 0001

Select pg_terminate_backend(0001);

Page 31: PostgreSQL Hem Güçlü Hem Güzel!

Postgres'i AnlamakPostgres'i Anlamak

, , , gibi yazılımlarla veri tabanısunucularımızı ve veri tabanlarımızı kontrol edebilirsiniz.

Nagios PRTG New Relic Cacti

Tavsiye: bir projesidir.check_postgres bucardo

check_postgres veri tabanımızın çeşitli özelliklerini izleyipkontrol edebilmemize yarayan bir betiktir. Nagios gibi

yazılımlarla veya bağımsız betiklerle çalışabilecek şekildetasarlanmıştır.

Page 32: PostgreSQL Hem Güçlü Hem Güzel!

Postgres'i AnlamakPostgres'i Anlamakarchive_ready autovac_freeze backends bloatcheckpoint cluster_id commitratio connection

custom_query database_size dbstatsdisabled_triggers disk_space fsm_pagesfsm_relations hitratio hot_standby_delay

index_size table_size relation_size last_analyzelast_vacuum last_autoanalyze last_autovacuumlistener locks logfile pgbouncer_backends

pgbouncer_checksum pgagent_jobs prepared_txnsquery_runtime query_time replicate_rowsame_schema sequence settings_checksumslony_status timesync txn_idle txn_time

version wal_files

Page 33: PostgreSQL Hem Güçlü Hem Güzel!

NagiosNagios

Page 34: PostgreSQL Hem Güçlü Hem Güzel!

Postgres'i AnlaPostgres'i AnlamakmakLogları toplayıp analiz edersek çok daha iyi anlamış oluruz.

Bunun için aşağıdaki araçları kullanabilirsiniz.

pg_fouinepgbadgerpgCluu

Log analiz etmek üzere tasarlanmış bu araçlar log incelemenizive bunlardan yola çıkarak kararlar almanızı sağlayacaktır.

Page 35: PostgreSQL Hem Güçlü Hem Güzel!

pgbadger ve pg_fouinepgbadger ve pg_fouine

Page 36: PostgreSQL Hem Güçlü Hem Güzel!

Postgres'i AnlamakPostgres'i AnlamakOnunla aynı dili konuşabilmektir.

SQL dili ile sorgulama yapabileceğimiz Postgres çeşitliprosedürel dilleri de temel dağıtımında içermektedir.

, , ve PL/pgSQL PL/Tcl PL/Perl PL/PythonAdı DiliPL/Java JavaPL/PHP PHPPL/R RPL/Ruby RubyPL/sh Unix shell

Page 37: PostgreSQL Hem Güçlü Hem Güzel!

Postgres ve DBA hayatıPostgres ve DBA hayatı"PostgreSQL: making very hard things possible,and simple things hard."

"PostgreSQL: çok zor şeyleri mümkün, çok basitşeyleri zor kılar."

Page 38: PostgreSQL Hem Güçlü Hem Güzel!

Postgres ve DBA HayatıPostgres ve DBA Hayatıİşleri olabildiğince otomatize edin.Bir yedekleme politikanız olsun.Yedekleriniz güvenli ve kullanılabilir olsun.Tablo ve dizin (index) boyutlarının artışını kontrol edin.Uzun süren sorguları loglayın ve bu sorguları düzenliaralıklarla iyileştirin.Loglara düşen hataları inceleyin ve nasıl bir soruna işaretettiklerini anlamaya çalışın, araştırın.Vacuum analyze, autovacuum, full vacuum işlerini planlayın.Veri tabanı kilitleri hakkında fikir edinin ve nasıl izleyipkontrol edeceğinizi bilin.

Page 39: PostgreSQL Hem Güçlü Hem Güzel!

Postgres ve DBA HayatıPostgres ve DBA Hayatıİşleri otomatize etmek için 'crontab' komutu çok faydalı

olacaktır. Yedekleme, vacuum yapma gibi rutinler her DBA'inhayatını kurtaran faydalı alışkanlıklardır.

gulcin# crontab -l00 02 * * * sh /home/postgres/scripts/getbackup.sh0 05 * * * sh /home/postgres/scripts/daily_vacuum_analyze.sh#WAL Archive CleanUp0 02 * * * sh /var/lib/pgsql/removewal_archive.sh

crontab -e // crontab dosyasını düzenlemeye yarar.

# * * * * * çalıştırılacak komut# ┬ ┬ ┬ ┬ ┬# │ │ │ │ │# │ │ │ │ │# │ │ │ │ └───── haftanın günü (0 - 7) (0'dan 6'ya Pazar'dan Cumartesi'ye demektir; 7 Pazar, 0 da Pazar.)# │ │ │ └────────── ay (1 - 12)# │ │ └─────────────── ayın günü (1 - 31)# │ └──────────────────── saat (0 - 23)# └───────────────────────── dakika (0 - 59)

Page 40: PostgreSQL Hem Güçlü Hem Güzel!

Cron için örnekCron için örnekNe kadar çok planlanmış iş o kadar çok kolaylık demektir.

exec &> /tmp/devfestwomen.logecho -e "Script Started at\t`date`\n\n"drop_database() # dbname{ echo " " echo "Restoring the database \"$1\"" echo " " psql -U postgres -d postgres -c "ALTER DATABASE $1 CONNECTION LIMIT 0;" psql -U postgres -d postgres -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity where datname=' psql -U postgres -d postgres -c "DROP DATABASE $1;"}create_database() # dbname,owner,dumpfile{ psql -U postgres -d postgres -c "CREATE DATABASE $1 OWNER $2 TABLESPACE new_tablespace;" psql -U postgres -d postgres -c "ALTER DATABASE $1 CONNECTION LIMIT 0;" psql -U postgres -d postgres -c "COMMENT ON DATABASE $1 IS 'DB updated at `date`'; " pg_restore -U postgres -j 4 -x -O --no-tablespaces -d $1 $3}open_database() # dbname{ psql -U postgres -d $1 -c "ANALYZE;" psql -U postgres -d postgres -c "ALTER DATABASE $1 CONNECTION LIMIT -1;"}

Page 41: PostgreSQL Hem Güçlü Hem Güzel!

Git kullanın!Git kullanın! apt-get install git // Debian tabanlı dağıtım Ubuntu gibi.yum install git // RHELyum install git-core // Fedora vs.

çok güzel. ile hemen öğren.Gitlab Demo

ssh-keygen -t rsa -C "[email protected]"cat ~/.ssh/id_rsa.pub

git config --global user.name "Gulcin Yildirim"git config --global user.email "[email protected]"

mkdir devfestwomencd devfestwomengit inittouch READMEgit add READMEgit commit -m 'Welcome to DevFest Women 2014!'git remote add origin [email protected]:gitlab/devfestwomen.gitgit push -u origin master

Page 42: PostgreSQL Hem Güçlü Hem Güzel!

Terminal ve psqlTerminal ve psql

Page 43: PostgreSQL Hem Güçlü Hem Güzel!

Terminal ve psqlTerminal ve psqlpsql Postgres'in etkileşimli (interaktif) terminalidir.

psql -h 127.0.0.1 -U gulcin -d database_1

Komutlar size çok hız kazandıracaktır.

\l ve \l+\c \dt ve \dt+\di ve \di+\d ve \d+\du\dp\df\db\x\q\?

Page 44: PostgreSQL Hem Güçlü Hem Güzel!

Linux KomutlarıLinux Komutlarıile çalışıyorsanız terminalde çalıştıracağınız komutlar ile

istediklerinizi daha hızlı yapabilirsiniz.psql

ls -lals -lhpwdlocatewhichdf -khfree -ghtop/top/atoppingtraceroutemounttail less vimnanocatscprsynccpmvrm -rfmkdir

Page 45: PostgreSQL Hem Güçlü Hem Güzel!

Teşekkürler.Teşekkürler.Soru var mı?Soru var mı?