3. Sunum Ne Hakkında?Sunum Ne Hakkında?
Postgres'i nasıl öğrenebilirim?
Postgres'i nasıl anlayabilirim?
Hangi alışkanlıklar DBA'in hayatını kurtarır?
Hangi araçlar ve eklentiler bana yardımcı olur?
Hangi SQL komutlarını bilmem gerekir?
En çok kullanacağım psql komutları nelerdir?
psql'i nasıl verimli kullanabilirim?
Hangi konfigürasyon parametrelerini bilsem iyi olur?
Hangi Linux komutlarını önce öğrenmeliyim?
Sorgu optimizasyonu ne kadar önemli?
4. Postgres ÖğrenmekPostgres Öğrenmek
Postgres kaydolun. Günde 1 mail ile ne kadar
çok şey öğrenebileceğinize inanamazsınız.
mail listelerine
Liste Tanımı
PostgreSQL yönetimi
Kullanıcılar için genel bir tartışma
alanı
Postgres ve ona bağlı servis
duyuruları
Postgres performansına ilişkin
konular
pgsql-admin
pgsql-general
psql-announce
psql-
performance
5. Postgres ÖğrenmekPostgres Öğrenmek
blogunu takip edin.
( , , , , ,
, , , , )
Planet PostgreSQL
2ndQuadrant pgExperts VMware OmniTI EnterpriseDB
EndPoint credativ Cybertec CommandPrompt OpenSCG
Hubert 'depesz' Lubaczewski
Dimitri Fontaine
Michael Paquier
Craig Kerstiens
Francisco Figueiredo Jr
gabrielle roth
Josh Berkus
Christophe Pettus
Chris Travers
Craig Ringer
6.
7. Postgres ÖğrenmekPostgres Öğrenmek
Karşılaştığınız her konsept için yazılmış
bulup okuyun.
Postgres belgeleme konusunda en zengin açık kaynak kodlu
projelerden biridir.
Çok sık kullandığınız özellikleri bile okuyun çünkü ufak bir
detay hayat kurtarıcı olabilir.
PostgreSQL
belgesini
"Why do I love Postgres?
- Because I'm not a DBA. "
9. Kurulumu Çok KolayKurulumu Çok Kolay
Mac
basit ve 'native' bir Mac OS X uygulaması ve
yü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
Linux
apt-get install postgresql-9.3
Windows
Window ile yüklemek için linki inceleyiniz.
10. pgAdminpgAdmin
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.
12. Postgres Çok GüzelPostgres Çok Güzel
Parçalı dizin (partial index) kullanımı
Create index index_1 on conference (presentation_id) where isactive = true;
Fonksiyonel dizin kullanımı
Create index index_2 on users to_lower(email);
Create index concurrently index_3 on users to_lower(email);
Şema (Schema)
Create schema womentechmakers;
Tablespace
Create tablespace women location '/data/women';
13. Postgres Çok GüzelPostgres Çok Güzel
Sorgu planlayıcısı harika!
Enum tipi
Boolean tipi
Hstore
Veri bölümleme
Replikasyon (Replication)
Window Functions
gin,gist
...
15. User vs RoleUser vs Role
Create 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=# du
List of roles
Role name | Attributes | Member of
-------------+------------------+--------------
devfest | | {}
devfestw | Cannot login | {}
devfestwomen | | {}
16. 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 ROLE
gulcin=# Grant gdg to devfest;
GRANT ROLE
gulcin=# Grant gdg to devfestw;
GRANT ROLE
gulcin=# Grant gdg to devfestwomen;
GRANT ROLE
gulcin=# du
List of roles
Role name | Attributes | Member of
-------------+------------------+--------------
devfest | | {gdg}
devfestw | Cannot login | {gdg}
devfestwomen | | {gdg}
gdg | Cannot login | {}
18. Nelere Bakmalıyım?Nelere Bakmalıyım?
Yetkilendirdim, nasıl geri alırım?
gulcin=# Alter role gdg superuser;
ALTER ROLE
gulcin=# du
List of roles
Role name | Attributes | Member of
-------------+-------------------------+------------
gdg | Superuser, Cannot login | {}
gulcin=# Alter role gdg nosuperuser;
ALTER ROLE
gulcin=# du
List of roles
Role name | Attributes | Member of
-------------+-------------------------+------------
gdg | Cannot login | {}
19. 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.
20. Explain vs Explain AnalyzeExplain vs Explain Analyze
gulcin=# 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;
21. Farklar ile ÖğrenmeFarklar ile Öğrenme
Konseptlerin ortak yönlerini, kullanım amaçlarını,
birbirlerinden ayrıldıkları noktaları bulmak detayı görmenize
yardım edecektir. Bu farkları bulmakla devam edebilirsiniz.
Constraint vs Index
Trigger vs Function
Index Scan vs Index-Only Scan
Vacuum vs Full Vacuum
pg_dump vs pg_basebackup
...
24. Postgres'i AnlamakPostgres'i Anlamak
Postgres 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 EXTENSION
gulcin=# 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)
25. Loglara bakarım, yetkilerini alırım. Kaldırırım.
Postgres'i AnlamakPostgres'i Anlamak
Diyelim ki bir tabloyu kaldırmak istedik...
gulcin=# select * from pg_stat_all_tables where relname = 'table_1';
-[ RECORD 1 ]-----+-------------------------------------------------
relid | 28193
schemaname | public
relname | table_1
seq_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 | 122323
n_live_tup | 1011
n_dead_tup | 58
last_vacuum | 2014-03-01 06:03:44.979917+02
last_autovacuum | 2014-03-01 17:08:39.960498+02
last_analyze | 2014-03-01 06:03:45.003016+02
last_autoanalyze | 2014-03-01 17:15:39.937703+02
vacuum_count | 184
autovacuum_count | 591
analyze_count | 185
autoanalyze_count | 754
gulcin=# select * from pg_stat_statements where query like '%table_1%';
(No rows)
26. Postgres'i AnlamakPostgres'i Anlamak
Konfigürasyon parametrelerini anlamaktır.
Loglara bakabilmek için log parametrelerini doğru ayarlamak
gerek.
Where, When, What to Log
#-------------------------------------------------
# ERROR REPORTING AND LOGGING
#-------------------------------------------------
# - Where to Log -
log_destination = 'stderr'
logging_collector = on
log_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
27. Postgres'i AnlamakPostgres'i Anlamak
#----------------------------------------------
# RUNTIME STATISTICS
#-----------------------------------------------
# - Query/Index Statistics Collector -
track_activities = on
track_counts = on
track_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.
28. Postgres'i AnlamakPostgres'i Anlamak
Kilitleri 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.pid
FROM pg_stat_activity,
pg_locks
LEFT
OUTER 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);
29. 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 izleyip
kontrol edebilmemize yarayan bir betiktir. Nagios gibi
yazılımlarla veya bağımsız betiklerle çalışabilecek şekilde
tasarlanmıştır.
32. Postgres'i AnlaPostgres'i Anlamakmak
Logları toplayıp analiz edersek çok daha iyi anlamış oluruz.
Bunun için aşağıdaki araçları kullanabilirsiniz.
pg_fouine
pgbadger
Log analiz etmek üzere tasarlanmış bu araçlar log incelemenizi
ve bunlardan yola çıkarak kararlar almanızı sağlayacaktır.
34. Postgres'i AnlamakPostgres'i Anlamak
Onunla aynı dili konuşabilmektir.
SQL dili ile sorgulama yapabileceğimiz Postgres çeşitli
prosedürel dilleri de temel dağıtımında içermektedir.
, , vePL/pgSQL PL/Tcl PL/Perl PL/Python
Adı Dili
PL/Java Java
PL/PHP PHP
PL/R R
PL/Ruby Ruby
PL/sh Unix shell
35. 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."
36. 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üzenli
aralıklarla iyileştirin.
Loglara düşen hataları inceleyin ve nasıl bir soruna işaret
ettiklerini 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 izleyip
kontrol edeceğinizi bilin.
37. 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'in
hayatını kurtaran faydalı alışkanlıklardır.
gulcin# crontab -l
00 02 * * * sh /home/postgres/scripts/getbackup.sh
0 05 * * * sh /home/postgres/scripts/daily_vacuum_analyze.sh
#WAL Archive CleanUp
0 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 P
# │ │ │ └────────── ay (1 - 12)
# │ │ └─────────────── ayın günü (1 - 31)
# │ └──────────────────── saat (0 - 23)
# └───────────────────────── dakika (0 - 59)
38. Cron için örnekCron için örnek
Ne kadar çok planlanmış iş o kadar çok kolaylık demektir.
exec &> /tmp/devfestwomen.log
echo -e "Script Started att`date`nn"
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_acti
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_tablesp
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;"
}
39. Git kullanın!Git kullanın!
apt-get install git // Debian tabanlı dağıtım Ubuntu gibi.
yum install git // RHEL
yum install git-core // Fedora vs.
çok güzel. ile hemen öğren.Gitlab Demo
ssh-keygen -t rsa -C "yildirim.gulcin88@gmail.com"
cat ~/.ssh/id_rsa.pub
git config --global user.name "Gulcin Yildirim"
git config --global user.email "yildirim.gulcin88@gmail.com"
mkdir devfestwomen
cd devfestwomen
git init
touch README
git add README
git commit -m 'Welcome to DevFest Women 2014!'
git remote add origin git@demo.gitlab.com:gitlab/devfestwomen.git
git push -u origin master
41. Terminal ve psqlTerminal ve psql
psql 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
?
42. Linux KomutlarıLinux Komutları
psql ile çalışıyorsanız terminalde çalıştıracağınız komutlar ile
istediklerinizi daha hızlı yapabilirsiniz.
ls -la
ls -lh
pwd
locate
which
df -kh
free -g
htop/top/atop
ping
traceroute
mount
tail
less
vim
nano
cat
scp
rsync
cp
mv
rm -rf
mkdir