[{"data":1,"prerenderedAt":2066},["ShallowReactive",2],{"page-tr-\u002Fblog\u002Fpostgresql-psql-commands":3,"related-tr-\u002Fblog\u002Fpostgresql-psql-commands":2041},{"id":4,"title":5,"body":6,"date":2028,"description":2029,"extension":2030,"meta":2031,"navigation":552,"path":2032,"seo":2033,"stem":2034,"tags":2035,"translation":2039,"__hash__":2040},"pages_tr\u002Ftr\u002Fblog\u002Fpostgresql-psql-commands.md","PostgreSQL ve psql Temel Komutları",{"type":7,"value":8,"toc":2015},"minimark",[9,14,23,29,33,155,166,181,185,188,406,409,488,492,720,726,740,744,996,1002,1006,1307,1311,1515,1525,1529,1601,1608,1611,1791,1795,1854,1865,1869,1976,1980,2011],[10,11,13],"h2",{"id":12},"giriş","Giriş",[15,16,17,18,22],"p",{},"PostgreSQL, açık kaynak dünyasının en çok tercih edilen ilişkisel veritabanlarından biri. ",[19,20,21],"code",{},"psql"," ise onun komut satırı istemcisi: GUI araçlarına göre daha hızlıdır, sunucuda her zaman hazırdır ve script'lerde kullanılabilir.",[15,24,25,26,28],{},"Bu yazı, ",[19,27,21],{}," ile günlük işte en çok kullanılan komutları ve SQL kalıplarını bir arada topluyor.",[10,30,32],{"id":31},"_1-bağlanma","1. Bağlanma",[34,35,40],"pre",{"className":36,"code":37,"language":38,"meta":39,"style":39},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","psql -U app -d appdb                         # lokal\npsql -h db.example.com -p 5432 -U app -d appdb\npsql \"postgresql:\u002F\u002Fapp:secret@localhost:5432\u002Fappdb\"\nsudo -u postgres psql                        # süper kullanıcı olarak (Linux)\ndocker compose exec db psql -U app -d appdb  # container içinde\n","bash","",[19,41,42,67,94,109,127],{"__ignoreMap":39},[43,44,47,50,54,57,60,63],"span",{"class":45,"line":46},"line",1,[43,48,21],{"class":49},"sBMFI",[43,51,53],{"class":52},"sfazB"," -U",[43,55,56],{"class":52}," app",[43,58,59],{"class":52}," -d",[43,61,62],{"class":52}," appdb",[43,64,66],{"class":65},"sHwdD","                         # lokal\n",[43,68,70,72,75,78,81,85,87,89,91],{"class":45,"line":69},2,[43,71,21],{"class":49},[43,73,74],{"class":52}," -h",[43,76,77],{"class":52}," db.example.com",[43,79,80],{"class":52}," -p",[43,82,84],{"class":83},"sbssI"," 5432",[43,86,53],{"class":52},[43,88,56],{"class":52},[43,90,59],{"class":52},[43,92,93],{"class":52}," appdb\n",[43,95,97,99,103,106],{"class":45,"line":96},3,[43,98,21],{"class":49},[43,100,102],{"class":101},"sMK4o"," \"",[43,104,105],{"class":52},"postgresql:\u002F\u002Fapp:secret@localhost:5432\u002Fappdb",[43,107,108],{"class":101},"\"\n",[43,110,112,115,118,121,124],{"class":45,"line":111},4,[43,113,114],{"class":49},"sudo",[43,116,117],{"class":52}," -u",[43,119,120],{"class":52}," postgres",[43,122,123],{"class":52}," psql",[43,125,126],{"class":65},"                        # süper kullanıcı olarak (Linux)\n",[43,128,130,133,136,139,142,144,146,148,150,152],{"class":45,"line":129},5,[43,131,132],{"class":49},"docker",[43,134,135],{"class":52}," compose",[43,137,138],{"class":52}," exec",[43,140,141],{"class":52}," db",[43,143,123],{"class":52},[43,145,53],{"class":52},[43,147,56],{"class":52},[43,149,59],{"class":52},[43,151,62],{"class":52},[43,153,154],{"class":65},"  # container içinde\n",[15,156,157,158,161,162,165],{},"Şifreyi her seferinde yazmamak için ",[19,159,160],{},"~\u002F.pgpass"," dosyası (izni ",[19,163,164],{},"600"," olmalı):",[34,167,169],{"className":36,"code":168,"language":38,"meta":39,"style":39},"# host:port:database:user:password\nlocalhost:5432:appdb:app:secret\n",[19,170,171,176],{"__ignoreMap":39},[43,172,173],{"class":45,"line":46},[43,174,175],{"class":65},"# host:port:database:user:password\n",[43,177,178],{"class":45,"line":69},[43,179,180],{"class":49},"localhost:5432:appdb:app:secret\n",[10,182,184],{"id":183},"_2-psql-meta-komutları","2. psql meta komutları",[15,186,187],{},"Ters bölü ile başlayan komutlar SQL değil, psql'in kendi komutlarıdır ve noktalı virgül gerektirmez.",[189,190,191,204],"table",{},[192,193,194],"thead",{},[195,196,197,201],"tr",{},[198,199,200],"th",{},"Komut",[198,202,203],{},"Açıklama",[205,206,207,218,228,238,252,262,272,282,292,302,312,322,332,342,352,362,372,382,396],"tbody",{},[195,208,209,215],{},[210,211,212],"td",{},[19,213,214],{},"\\l",[210,216,217],{},"Veritabanlarını listele",[195,219,220,225],{},[210,221,222],{},[19,223,224],{},"\\c appdb",[210,226,227],{},"Başka veritabanına geç",[195,229,230,235],{},[210,231,232],{},[19,233,234],{},"\\dn",[210,236,237],{},"Şemalar",[195,239,240,245],{},[210,241,242],{},[19,243,244],{},"\\dt",[210,246,247,248,251],{},"Tablolar (",[19,249,250],{},"\\dt *.*"," tüm şemalar)",[195,253,254,259],{},[210,255,256],{},[19,257,258],{},"\\d users",[210,260,261],{},"Tablonun kolonları, index'leri, constraint'leri",[195,263,264,269],{},[210,265,266],{},[19,267,268],{},"\\d+ users",[210,270,271],{},"Ek olarak boyut ve açıklamalar",[195,273,274,279],{},[210,275,276],{},[19,277,278],{},"\\di",[210,280,281],{},"Index'ler",[195,283,284,289],{},[210,285,286],{},[19,287,288],{},"\\dv",[210,290,291],{},"View'lar",[195,293,294,299],{},[210,295,296],{},[19,297,298],{},"\\df",[210,300,301],{},"Fonksiyonlar",[195,303,304,309],{},[210,305,306],{},[19,307,308],{},"\\du",[210,310,311],{},"Kullanıcılar\u002Froller",[195,313,314,319],{},[210,315,316],{},[19,317,318],{},"\\dp users",[210,320,321],{},"Tablo yetkileri",[195,323,324,329],{},[210,325,326],{},[19,327,328],{},"\\x",[210,330,331],{},"Geniş satırları dikey göster (aç\u002Fkapat)",[195,333,334,339],{},[210,335,336],{},[19,337,338],{},"\\timing",[210,340,341],{},"Sorgu süresini göster",[195,343,344,349],{},[210,345,346],{},[19,347,348],{},"\\e",[210,350,351],{},"Son sorguyu editörde düzenle",[195,353,354,359],{},[210,355,356],{},[19,357,358],{},"\\i file.sql",[210,360,361],{},"Dosyadaki SQL'i çalıştır",[195,363,364,369],{},[210,365,366],{},[19,367,368],{},"\\o out.txt",[210,370,371],{},"Çıktıyı dosyaya yaz",[195,373,374,379],{},[210,375,376],{},[19,377,378],{},"\\conninfo",[210,380,381],{},"Mevcut bağlantı bilgisi",[195,383,384,393],{},[210,385,386,389,390],{},[19,387,388],{},"\\?"," \u002F ",[19,391,392],{},"\\h SELECT",[210,394,395],{},"psql yardımı \u002F SQL komut yardımı",[195,397,398,403],{},[210,399,400],{},[19,401,402],{},"\\q",[210,404,405],{},"Çıkış",[15,407,408],{},"Tek bir komut çalıştırıp çıkmak için:",[34,410,412],{"className":36,"code":411,"language":38,"meta":39,"style":39},"psql -U app -d appdb -c \"SELECT count(*) FROM users;\"\npsql -U app -d appdb -f migration.sql\npsql -U app -d appdb -At -c \"SELECT email FROM users\" > emails.txt   # sade çıktı\n",[19,413,414,436,454],{"__ignoreMap":39},[43,415,416,418,420,422,424,426,429,431,434],{"class":45,"line":46},[43,417,21],{"class":49},[43,419,53],{"class":52},[43,421,56],{"class":52},[43,423,59],{"class":52},[43,425,62],{"class":52},[43,427,428],{"class":52}," -c",[43,430,102],{"class":101},[43,432,433],{"class":52},"SELECT count(*) FROM users;",[43,435,108],{"class":101},[43,437,438,440,442,444,446,448,451],{"class":45,"line":69},[43,439,21],{"class":49},[43,441,53],{"class":52},[43,443,56],{"class":52},[43,445,59],{"class":52},[43,447,62],{"class":52},[43,449,450],{"class":52}," -f",[43,452,453],{"class":52}," migration.sql\n",[43,455,456,458,460,462,464,466,469,471,473,476,479,482,485],{"class":45,"line":96},[43,457,21],{"class":49},[43,459,53],{"class":52},[43,461,56],{"class":52},[43,463,59],{"class":52},[43,465,62],{"class":52},[43,467,468],{"class":52}," -At",[43,470,428],{"class":52},[43,472,102],{"class":101},[43,474,475],{"class":52},"SELECT email FROM users",[43,477,478],{"class":101},"\"",[43,480,481],{"class":101}," >",[43,483,484],{"class":52}," emails.txt",[43,486,487],{"class":65},"   # sade çıktı\n",[10,489,491],{"id":490},"_3-veritabanı-ve-kullanıcı-oluşturma","3. Veritabanı ve kullanıcı oluşturma",[34,493,497],{"className":494,"code":495,"language":496,"meta":39,"style":39},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","CREATE ROLE app WITH LOGIN PASSWORD 'secret';\nCREATE DATABASE appdb OWNER app;\n\n-- Sadece okuma yetkili kullanıcı\nCREATE ROLE reporter WITH LOGIN PASSWORD 'secret2';\nGRANT CONNECT ON DATABASE appdb TO reporter;\nGRANT USAGE ON SCHEMA public TO reporter;\nGRANT SELECT ON ALL TABLES IN SCHEMA public TO reporter;\nALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO reporter;\n\nALTER ROLE app WITH PASSWORD 'new-secret';\nDROP ROLE reporter;\n","sql",[19,498,499,532,548,554,559,583,606,627,651,683,688,710],{"__ignoreMap":39},[43,500,501,504,507,511,514,517,520,523,526,529],{"class":45,"line":46},[43,502,503],{"class":83},"CREATE",[43,505,506],{"class":83}," ROLE",[43,508,510],{"class":509},"sTEyZ"," app ",[43,512,513],{"class":83},"WITH",[43,515,516],{"class":83}," LOGIN",[43,518,519],{"class":83}," PASSWORD",[43,521,522],{"class":101}," '",[43,524,525],{"class":52},"secret",[43,527,528],{"class":101},"'",[43,530,531],{"class":509},";\n",[43,533,534,536,539,542,545],{"class":45,"line":69},[43,535,503],{"class":83},[43,537,538],{"class":83}," DATABASE",[43,540,62],{"class":541},"s2Zo4",[43,543,544],{"class":83}," OWNER",[43,546,547],{"class":509}," app;\n",[43,549,550],{"class":45,"line":96},[43,551,553],{"emptyLinePlaceholder":552},true,"\n",[43,555,556],{"class":45,"line":111},[43,557,558],{"class":65},"-- Sadece okuma yetkili kullanıcı\n",[43,560,561,563,565,568,570,572,574,576,579,581],{"class":45,"line":129},[43,562,503],{"class":83},[43,564,506],{"class":83},[43,566,567],{"class":509}," reporter ",[43,569,513],{"class":83},[43,571,516],{"class":83},[43,573,519],{"class":83},[43,575,522],{"class":101},[43,577,578],{"class":52},"secret2",[43,580,528],{"class":101},[43,582,531],{"class":509},[43,584,586,589,592,595,597,600,603],{"class":45,"line":585},6,[43,587,588],{"class":83},"GRANT",[43,590,591],{"class":83}," CONNECT",[43,593,594],{"class":83}," ON",[43,596,538],{"class":83},[43,598,599],{"class":509}," appdb ",[43,601,602],{"class":83},"TO",[43,604,605],{"class":509}," reporter;\n",[43,607,609,611,614,617,620,623,625],{"class":45,"line":608},7,[43,610,588],{"class":83},[43,612,613],{"class":509}," USAGE ",[43,615,616],{"class":83},"ON",[43,618,619],{"class":83}," SCHEMA",[43,621,622],{"class":509}," public ",[43,624,602],{"class":83},[43,626,605],{"class":509},[43,628,630,632,635,637,640,643,645,647,649],{"class":45,"line":629},8,[43,631,588],{"class":83},[43,633,634],{"class":83}," SELECT",[43,636,594],{"class":83},[43,638,639],{"class":509}," ALL TABLES ",[43,641,642],{"class":83},"IN",[43,644,619],{"class":83},[43,646,622],{"class":509},[43,648,602],{"class":83},[43,650,605],{"class":509},[43,652,654,657,661,664,666,668,670,672,674,676,679,681],{"class":45,"line":653},9,[43,655,656],{"class":83},"ALTER",[43,658,660],{"class":659},"spNyl"," DEFAULT",[43,662,663],{"class":509}," PRIVILEGES ",[43,665,642],{"class":83},[43,667,619],{"class":83},[43,669,622],{"class":509},[43,671,588],{"class":83},[43,673,634],{"class":83},[43,675,594],{"class":83},[43,677,678],{"class":509}," TABLES ",[43,680,602],{"class":83},[43,682,605],{"class":509},[43,684,686],{"class":45,"line":685},10,[43,687,553],{"emptyLinePlaceholder":552},[43,689,691,693,695,697,699,701,703,706,708],{"class":45,"line":690},11,[43,692,656],{"class":83},[43,694,506],{"class":83},[43,696,510],{"class":509},[43,698,513],{"class":83},[43,700,519],{"class":83},[43,702,522],{"class":101},[43,704,705],{"class":52},"new-secret",[43,707,528],{"class":101},[43,709,531],{"class":509},[43,711,713,716,718],{"class":45,"line":712},12,[43,714,715],{"class":83},"DROP",[43,717,506],{"class":83},[43,719,605],{"class":509},[15,721,722,725],{},[19,723,724],{},"ALTER DEFAULT PRIVILEGES",", ileride oluşturulacak tablolara da yetkinin otomatik verilmesini sağlar; unutulursa yeni tablolar okunamaz.",[727,728,729],"blockquote",{},[15,730,731,732,735,736,739],{},"PostgreSQL 15'ten itibaren ",[19,733,734],{},"public"," şemasında herkesin tablo oluşturma yetkisi kaldırıldı. Uygulama kullanıcısı veritabanının sahibi değilse ",[19,737,738],{},"GRANT CREATE ON SCHEMA public TO app;"," gerekebilir.",[10,741,743],{"id":742},"_4-tablo-işlemleri","4. Tablo işlemleri",[34,745,747],{"className":494,"code":746,"language":496,"meta":39,"style":39},"CREATE TABLE users (\n    id          BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n    email       TEXT NOT NULL UNIQUE,\n    name        TEXT NOT NULL,\n    metadata    JSONB DEFAULT '{}'::jsonb,\n    created_at  TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\nALTER TABLE users ADD COLUMN last_login TIMESTAMPTZ;\nALTER TABLE users ALTER COLUMN name TYPE VARCHAR(200);\nALTER TABLE users RENAME COLUMN name TO full_name;\nCREATE INDEX idx_users_created_at ON users (created_at);\nCREATE INDEX CONCURRENTLY idx_users_meta ON users USING gin (metadata);\nTRUNCATE users RESTART IDENTITY;\nDROP TABLE IF EXISTS users;\n",[19,748,749,762,788,804,816,834,852,857,861,880,910,927,942,965,980],{"__ignoreMap":39},[43,750,751,753,756,759],{"class":45,"line":46},[43,752,503],{"class":83},[43,754,755],{"class":83}," TABLE",[43,757,758],{"class":541}," users",[43,760,761],{"class":509}," (\n",[43,763,764,767,770,773,776,779,782,785],{"class":45,"line":69},[43,765,766],{"class":509},"    id          ",[43,768,769],{"class":659},"BIGINT",[43,771,772],{"class":83}," GENERATED",[43,774,775],{"class":83}," ALWAYS",[43,777,778],{"class":83}," AS",[43,780,781],{"class":83}," IDENTITY",[43,783,784],{"class":659}," PRIMARY KEY",[43,786,787],{"class":509},",\n",[43,789,790,793,796,799,802],{"class":45,"line":96},[43,791,792],{"class":509},"    email       ",[43,794,795],{"class":659},"TEXT",[43,797,798],{"class":83}," NOT NULL",[43,800,801],{"class":83}," UNIQUE",[43,803,787],{"class":509},[43,805,806,809,812,814],{"class":45,"line":111},[43,807,808],{"class":83},"    name",[43,810,811],{"class":659},"        TEXT",[43,813,798],{"class":83},[43,815,787],{"class":509},[43,817,818,821,824,826,829,831],{"class":45,"line":129},[43,819,820],{"class":509},"    metadata    JSONB ",[43,822,823],{"class":659},"DEFAULT",[43,825,522],{"class":101},[43,827,828],{"class":52},"{}",[43,830,528],{"class":101},[43,832,833],{"class":509},"::jsonb,\n",[43,835,836,839,842,844,846,849],{"class":45,"line":585},[43,837,838],{"class":509},"    created_at  ",[43,840,841],{"class":659},"TIMESTAMPTZ",[43,843,798],{"class":83},[43,845,660],{"class":659},[43,847,848],{"class":83}," now",[43,850,851],{"class":101},"()\n",[43,853,854],{"class":45,"line":608},[43,855,856],{"class":509},");\n",[43,858,859],{"class":45,"line":629},[43,860,553],{"emptyLinePlaceholder":552},[43,862,863,865,867,870,873,876,878],{"class":45,"line":653},[43,864,656],{"class":83},[43,866,755],{"class":83},[43,868,869],{"class":509}," users ",[43,871,872],{"class":83},"ADD",[43,874,875],{"class":509}," COLUMN last_login ",[43,877,841],{"class":659},[43,879,531],{"class":509},[43,881,882,884,886,888,890,893,896,899,902,905,908],{"class":45,"line":685},[43,883,656],{"class":83},[43,885,755],{"class":83},[43,887,869],{"class":509},[43,889,656],{"class":83},[43,891,892],{"class":509}," COLUMN ",[43,894,895],{"class":83},"name",[43,897,898],{"class":83}," TYPE",[43,900,901],{"class":659}," VARCHAR",[43,903,904],{"class":509},"(",[43,906,907],{"class":83},"200",[43,909,856],{"class":509},[43,911,912,914,916,919,921,924],{"class":45,"line":690},[43,913,656],{"class":83},[43,915,755],{"class":83},[43,917,918],{"class":509}," users RENAME COLUMN ",[43,920,895],{"class":83},[43,922,923],{"class":83}," TO",[43,925,926],{"class":509}," full_name;\n",[43,928,929,931,934,937,939],{"class":45,"line":712},[43,930,503],{"class":83},[43,932,933],{"class":83}," INDEX",[43,935,936],{"class":541}," idx_users_created_at",[43,938,594],{"class":83},[43,940,941],{"class":509}," users (created_at);\n",[43,943,945,947,949,952,955,957,959,962],{"class":45,"line":944},13,[43,946,503],{"class":83},[43,948,933],{"class":83},[43,950,951],{"class":541}," CONCURRENTLY",[43,953,954],{"class":509}," idx_users_meta ",[43,956,616],{"class":83},[43,958,869],{"class":509},[43,960,961],{"class":83},"USING",[43,963,964],{"class":509}," gin (metadata);\n",[43,966,968,971,973,976,978],{"class":45,"line":967},14,[43,969,970],{"class":83},"TRUNCATE",[43,972,869],{"class":509},[43,974,975],{"class":83},"RESTART",[43,977,781],{"class":83},[43,979,531],{"class":509},[43,981,983,985,987,990,993],{"class":45,"line":982},15,[43,984,715],{"class":83},[43,986,755],{"class":83},[43,988,989],{"class":83}," IF",[43,991,992],{"class":83}," EXISTS",[43,994,995],{"class":509}," users;\n",[15,997,998,1001],{},[19,999,1000],{},"CREATE INDEX CONCURRENTLY"," tabloyu yazmaya kilitlemeden index oluşturur; canlı sistemlerde tercih edilmelidir (transaction içinde çalıştırılamaz).",[10,1003,1005],{"id":1004},"_5-pratik-sql-kalıpları","5. Pratik SQL kalıpları",[34,1007,1009],{"className":494,"code":1008,"language":496,"meta":39,"style":39},"-- Upsert\nINSERT INTO users (email, name) VALUES ('a@example.com', 'A')\nON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name;\n\n-- Eklenen\u002Fgüncellenen satırı geri döndür\nUPDATE users SET last_login = now() WHERE id = 42 RETURNING *;\n\n-- JSONB sorgusu\nSELECT * FROM users WHERE metadata->>'plan' = 'pro';\nSELECT * FROM users WHERE metadata @> '{\"beta\": true}';\n\n-- Sayfalama\nSELECT * FROM users ORDER BY id LIMIT 20 OFFSET 40;\n\n-- Gruplu sayım\nSELECT date_trunc('day', created_at) AS day, count(*)\nFROM users GROUP BY 1 ORDER BY 1 DESC;\n",[19,1010,1011,1016,1055,1077,1081,1086,1125,1129,1134,1174,1201,1205,1210,1239,1243,1248,1283],{"__ignoreMap":39},[43,1012,1013],{"class":45,"line":46},[43,1014,1015],{"class":65},"-- Upsert\n",[43,1017,1018,1021,1024,1026,1029,1032,1035,1037,1040,1042,1045,1047,1050,1052],{"class":45,"line":69},[43,1019,1020],{"class":83},"INSERT INTO",[43,1022,1023],{"class":509}," users (email, ",[43,1025,895],{"class":83},[43,1027,1028],{"class":509},") ",[43,1030,1031],{"class":83},"VALUES",[43,1033,1034],{"class":509}," (",[43,1036,528],{"class":101},[43,1038,1039],{"class":52},"a@example.com",[43,1041,528],{"class":101},[43,1043,1044],{"class":509},", ",[43,1046,528],{"class":101},[43,1048,1049],{"class":52},"A",[43,1051,528],{"class":101},[43,1053,1054],{"class":509},")\n",[43,1056,1057,1059,1062,1065,1068,1071,1074],{"class":45,"line":96},[43,1058,616],{"class":83},[43,1060,1061],{"class":509}," CONFLICT (email) DO ",[43,1063,1064],{"class":83},"UPDATE",[43,1066,1067],{"class":83}," SET",[43,1069,1070],{"class":83}," name",[43,1072,1073],{"class":101}," =",[43,1075,1076],{"class":509}," EXCLUDED.name;\n",[43,1078,1079],{"class":45,"line":111},[43,1080,553],{"emptyLinePlaceholder":552},[43,1082,1083],{"class":45,"line":129},[43,1084,1085],{"class":65},"-- Eklenen\u002Fgüncellenen satırı geri döndür\n",[43,1087,1088,1090,1092,1095,1098,1101,1103,1106,1109,1112,1114,1117,1120,1123],{"class":45,"line":585},[43,1089,1064],{"class":83},[43,1091,869],{"class":509},[43,1093,1094],{"class":83},"SET",[43,1096,1097],{"class":509}," last_login ",[43,1099,1100],{"class":101},"=",[43,1102,848],{"class":83},[43,1104,1105],{"class":101},"()",[43,1107,1108],{"class":83}," WHERE",[43,1110,1111],{"class":509}," id ",[43,1113,1100],{"class":101},[43,1115,1116],{"class":83}," 42",[43,1118,1119],{"class":509}," RETURNING ",[43,1121,1122],{"class":101},"*",[43,1124,531],{"class":509},[43,1126,1127],{"class":45,"line":608},[43,1128,553],{"emptyLinePlaceholder":552},[43,1130,1131],{"class":45,"line":629},[43,1132,1133],{"class":65},"-- JSONB sorgusu\n",[43,1135,1136,1139,1142,1145,1147,1150,1153,1156,1158,1161,1163,1165,1167,1170,1172],{"class":45,"line":653},[43,1137,1138],{"class":83},"SELECT",[43,1140,1141],{"class":101}," *",[43,1143,1144],{"class":83}," FROM",[43,1146,869],{"class":509},[43,1148,1149],{"class":83},"WHERE",[43,1151,1152],{"class":509}," metadata",[43,1154,1155],{"class":101},"->>",[43,1157,528],{"class":101},[43,1159,1160],{"class":52},"plan",[43,1162,528],{"class":101},[43,1164,1073],{"class":101},[43,1166,522],{"class":101},[43,1168,1169],{"class":52},"pro",[43,1171,528],{"class":101},[43,1173,531],{"class":509},[43,1175,1176,1178,1180,1182,1184,1186,1189,1192,1194,1197,1199],{"class":45,"line":685},[43,1177,1138],{"class":83},[43,1179,1141],{"class":101},[43,1181,1144],{"class":83},[43,1183,869],{"class":509},[43,1185,1149],{"class":83},[43,1187,1188],{"class":509}," metadata @",[43,1190,1191],{"class":101},">",[43,1193,522],{"class":101},[43,1195,1196],{"class":52},"{\"beta\": true}",[43,1198,528],{"class":101},[43,1200,531],{"class":509},[43,1202,1203],{"class":45,"line":690},[43,1204,553],{"emptyLinePlaceholder":552},[43,1206,1207],{"class":45,"line":712},[43,1208,1209],{"class":65},"-- Sayfalama\n",[43,1211,1212,1214,1216,1218,1220,1223,1225,1228,1231,1234,1237],{"class":45,"line":944},[43,1213,1138],{"class":83},[43,1215,1141],{"class":101},[43,1217,1144],{"class":83},[43,1219,869],{"class":509},[43,1221,1222],{"class":83},"ORDER BY",[43,1224,1111],{"class":509},[43,1226,1227],{"class":83},"LIMIT",[43,1229,1230],{"class":83}," 20",[43,1232,1233],{"class":509}," OFFSET ",[43,1235,1236],{"class":83},"40",[43,1238,531],{"class":509},[43,1240,1241],{"class":45,"line":967},[43,1242,553],{"emptyLinePlaceholder":552},[43,1244,1245],{"class":45,"line":982},[43,1246,1247],{"class":65},"-- Gruplu sayım\n",[43,1249,1251,1253,1256,1258,1261,1263,1266,1269,1272,1274,1277,1279,1281],{"class":45,"line":1250},16,[43,1252,1138],{"class":83},[43,1254,1255],{"class":509}," date_trunc(",[43,1257,528],{"class":101},[43,1259,1260],{"class":52},"day",[43,1262,528],{"class":101},[43,1264,1265],{"class":509},", created_at) ",[43,1267,1268],{"class":83},"AS",[43,1270,1271],{"class":83}," day",[43,1273,1044],{"class":509},[43,1275,1276],{"class":541},"count",[43,1278,904],{"class":509},[43,1280,1122],{"class":101},[43,1282,1054],{"class":509},[43,1284,1286,1289,1291,1294,1297,1300,1302,1305],{"class":45,"line":1285},17,[43,1287,1288],{"class":83},"FROM",[43,1290,869],{"class":509},[43,1292,1293],{"class":83},"GROUP BY",[43,1295,1296],{"class":83}," 1",[43,1298,1299],{"class":83}," ORDER BY",[43,1301,1296],{"class":83},[43,1303,1304],{"class":83}," DESC",[43,1306,531],{"class":509},[10,1308,1310],{"id":1309},"_6-yedekleme-ve-geri-yükleme","6. Yedekleme ve geri yükleme",[34,1312,1314],{"className":36,"code":1313,"language":38,"meta":39,"style":39},"# Tek veritabanı, düz SQL\npg_dump -U app -d appdb > appdb.sql\n\n# Sıkıştırılmış custom format (önerilen)\npg_dump -U app -d appdb -Fc -f appdb.dump\n\n# Sadece şema \u002F sadece belirli tablo\npg_dump -U app -d appdb --schema-only > schema.sql\npg_dump -U app -d appdb -t users -Fc -f users.dump\n\n# Geri yükleme\npsql -U app -d appdb \u003C appdb.sql\npg_restore -U app -d appdb --clean --if-exists appdb.dump\npg_restore -U app -d appdb -j 4 appdb.dump        # 4 paralel iş\n\n# Tüm cluster (roller dahil)\npg_dumpall -U postgres > all.sql\n",[19,1315,1316,1321,1339,1343,1348,1368,1372,1377,1397,1421,1425,1430,1447,1468,1492,1496,1501],{"__ignoreMap":39},[43,1317,1318],{"class":45,"line":46},[43,1319,1320],{"class":65},"# Tek veritabanı, düz SQL\n",[43,1322,1323,1326,1328,1330,1332,1334,1336],{"class":45,"line":69},[43,1324,1325],{"class":49},"pg_dump",[43,1327,53],{"class":52},[43,1329,56],{"class":52},[43,1331,59],{"class":52},[43,1333,62],{"class":52},[43,1335,481],{"class":101},[43,1337,1338],{"class":52}," appdb.sql\n",[43,1340,1341],{"class":45,"line":96},[43,1342,553],{"emptyLinePlaceholder":552},[43,1344,1345],{"class":45,"line":111},[43,1346,1347],{"class":65},"# Sıkıştırılmış custom format (önerilen)\n",[43,1349,1350,1352,1354,1356,1358,1360,1363,1365],{"class":45,"line":129},[43,1351,1325],{"class":49},[43,1353,53],{"class":52},[43,1355,56],{"class":52},[43,1357,59],{"class":52},[43,1359,62],{"class":52},[43,1361,1362],{"class":52}," -Fc",[43,1364,450],{"class":52},[43,1366,1367],{"class":52}," appdb.dump\n",[43,1369,1370],{"class":45,"line":585},[43,1371,553],{"emptyLinePlaceholder":552},[43,1373,1374],{"class":45,"line":608},[43,1375,1376],{"class":65},"# Sadece şema \u002F sadece belirli tablo\n",[43,1378,1379,1381,1383,1385,1387,1389,1392,1394],{"class":45,"line":629},[43,1380,1325],{"class":49},[43,1382,53],{"class":52},[43,1384,56],{"class":52},[43,1386,59],{"class":52},[43,1388,62],{"class":52},[43,1390,1391],{"class":52}," --schema-only",[43,1393,481],{"class":101},[43,1395,1396],{"class":52}," schema.sql\n",[43,1398,1399,1401,1403,1405,1407,1409,1412,1414,1416,1418],{"class":45,"line":653},[43,1400,1325],{"class":49},[43,1402,53],{"class":52},[43,1404,56],{"class":52},[43,1406,59],{"class":52},[43,1408,62],{"class":52},[43,1410,1411],{"class":52}," -t",[43,1413,758],{"class":52},[43,1415,1362],{"class":52},[43,1417,450],{"class":52},[43,1419,1420],{"class":52}," users.dump\n",[43,1422,1423],{"class":45,"line":685},[43,1424,553],{"emptyLinePlaceholder":552},[43,1426,1427],{"class":45,"line":690},[43,1428,1429],{"class":65},"# Geri yükleme\n",[43,1431,1432,1434,1436,1438,1440,1442,1445],{"class":45,"line":712},[43,1433,21],{"class":49},[43,1435,53],{"class":52},[43,1437,56],{"class":52},[43,1439,59],{"class":52},[43,1441,62],{"class":52},[43,1443,1444],{"class":101}," \u003C",[43,1446,1338],{"class":52},[43,1448,1449,1452,1454,1456,1458,1460,1463,1466],{"class":45,"line":944},[43,1450,1451],{"class":49},"pg_restore",[43,1453,53],{"class":52},[43,1455,56],{"class":52},[43,1457,59],{"class":52},[43,1459,62],{"class":52},[43,1461,1462],{"class":52}," --clean",[43,1464,1465],{"class":52}," --if-exists",[43,1467,1367],{"class":52},[43,1469,1470,1472,1474,1476,1478,1480,1483,1486,1489],{"class":45,"line":967},[43,1471,1451],{"class":49},[43,1473,53],{"class":52},[43,1475,56],{"class":52},[43,1477,59],{"class":52},[43,1479,62],{"class":52},[43,1481,1482],{"class":52}," -j",[43,1484,1485],{"class":83}," 4",[43,1487,1488],{"class":52}," appdb.dump",[43,1490,1491],{"class":65},"        # 4 paralel iş\n",[43,1493,1494],{"class":45,"line":982},[43,1495,553],{"emptyLinePlaceholder":552},[43,1497,1498],{"class":45,"line":1250},[43,1499,1500],{"class":65},"# Tüm cluster (roller dahil)\n",[43,1502,1503,1506,1508,1510,1512],{"class":45,"line":1285},[43,1504,1505],{"class":49},"pg_dumpall",[43,1507,53],{"class":52},[43,1509,120],{"class":52},[43,1511,481],{"class":101},[43,1513,1514],{"class":52}," all.sql\n",[15,1516,1517,1518,1521,1522,1524],{},"Custom format (",[19,1519,1520],{},"-Fc",") hem sıkıştırılmıştır hem de ",[19,1523,1451],{}," ile seçici ve paralel geri yüklemeye izin verir.",[10,1526,1528],{"id":1527},"_7-performans-ve-sorgu-analizi","7. Performans ve sorgu analizi",[34,1530,1532],{"className":494,"code":1531,"language":496,"meta":39,"style":39},"EXPLAIN SELECT * FROM users WHERE email = 'a@example.com';\nEXPLAIN (ANALYZE, BUFFERS) SELECT * FROM users WHERE created_at > now() - interval '7 days';\n",[19,1533,1534,1562],{"__ignoreMap":39},[43,1535,1536,1539,1541,1543,1545,1547,1549,1552,1554,1556,1558,1560],{"class":45,"line":46},[43,1537,1538],{"class":509},"EXPLAIN ",[43,1540,1138],{"class":83},[43,1542,1141],{"class":101},[43,1544,1144],{"class":83},[43,1546,869],{"class":509},[43,1548,1149],{"class":83},[43,1550,1551],{"class":509}," email ",[43,1553,1100],{"class":101},[43,1555,522],{"class":101},[43,1557,1039],{"class":52},[43,1559,528],{"class":101},[43,1561,531],{"class":509},[43,1563,1564,1567,1569,1571,1573,1575,1577,1580,1582,1584,1586,1589,1592,1594,1597,1599],{"class":45,"line":69},[43,1565,1566],{"class":509},"EXPLAIN (ANALYZE, BUFFERS) ",[43,1568,1138],{"class":83},[43,1570,1141],{"class":101},[43,1572,1144],{"class":83},[43,1574,869],{"class":509},[43,1576,1149],{"class":83},[43,1578,1579],{"class":509}," created_at ",[43,1581,1191],{"class":101},[43,1583,848],{"class":83},[43,1585,1105],{"class":101},[43,1587,1588],{"class":101}," -",[43,1590,1591],{"class":509}," interval ",[43,1593,528],{"class":101},[43,1595,1596],{"class":52},"7 days",[43,1598,528],{"class":101},[43,1600,531],{"class":509},[15,1602,1603,1604,1607],{},"Çıktıda büyük tablolarda ",[19,1605,1606],{},"Seq Scan"," görüyorsanız ve sorgu seçiciyse, ilgili kolona index eklemeyi düşünün.",[15,1609,1610],{},"Çalışan sorgular ve kilitler:",[34,1612,1614],{"className":494,"code":1613,"language":496,"meta":39,"style":39},"-- Aktif sorgular\nSELECT pid, usename, state, now() - query_start AS duration, query\nFROM pg_stat_activity\nWHERE state \u003C> 'idle'\nORDER BY duration DESC;\n\n-- Sorguyu iptal et \u002F bağlantıyı sonlandır\nSELECT pg_cancel_backend(12345);\nSELECT pg_terminate_backend(12345);\n\n-- Tablo ve index boyutları\nSELECT relname,\n       pg_size_pretty(pg_total_relation_size(relid)) AS total\nFROM pg_catalog.pg_statio_user_tables\nORDER BY pg_total_relation_size(relid) DESC\nLIMIT 10;\n\nSELECT pg_size_pretty(pg_database_size('appdb'));\n",[19,1615,1616,1621,1648,1655,1673,1685,1689,1694,1706,1717,1721,1726,1733,1743,1750,1760,1769,1773],{"__ignoreMap":39},[43,1617,1618],{"class":45,"line":46},[43,1619,1620],{"class":65},"-- Aktif sorgular\n",[43,1622,1623,1625,1628,1631,1633,1636,1638,1640,1643,1645],{"class":45,"line":69},[43,1624,1138],{"class":83},[43,1626,1627],{"class":509}," pid, usename, ",[43,1629,1630],{"class":83},"state",[43,1632,1044],{"class":509},[43,1634,1635],{"class":83},"now",[43,1637,1105],{"class":101},[43,1639,1588],{"class":101},[43,1641,1642],{"class":509}," query_start ",[43,1644,1268],{"class":83},[43,1646,1647],{"class":509}," duration, query\n",[43,1649,1650,1652],{"class":45,"line":96},[43,1651,1288],{"class":83},[43,1653,1654],{"class":509}," pg_stat_activity\n",[43,1656,1657,1659,1662,1665,1667,1670],{"class":45,"line":111},[43,1658,1149],{"class":83},[43,1660,1661],{"class":83}," state",[43,1663,1664],{"class":101}," \u003C>",[43,1666,522],{"class":101},[43,1668,1669],{"class":52},"idle",[43,1671,1672],{"class":101},"'\n",[43,1674,1675,1677,1680,1683],{"class":45,"line":129},[43,1676,1222],{"class":83},[43,1678,1679],{"class":509}," duration ",[43,1681,1682],{"class":83},"DESC",[43,1684,531],{"class":509},[43,1686,1687],{"class":45,"line":585},[43,1688,553],{"emptyLinePlaceholder":552},[43,1690,1691],{"class":45,"line":608},[43,1692,1693],{"class":65},"-- Sorguyu iptal et \u002F bağlantıyı sonlandır\n",[43,1695,1696,1698,1701,1704],{"class":45,"line":629},[43,1697,1138],{"class":83},[43,1699,1700],{"class":509}," pg_cancel_backend(",[43,1702,1703],{"class":83},"12345",[43,1705,856],{"class":509},[43,1707,1708,1710,1713,1715],{"class":45,"line":653},[43,1709,1138],{"class":83},[43,1711,1712],{"class":509}," pg_terminate_backend(",[43,1714,1703],{"class":83},[43,1716,856],{"class":509},[43,1718,1719],{"class":45,"line":685},[43,1720,553],{"emptyLinePlaceholder":552},[43,1722,1723],{"class":45,"line":690},[43,1724,1725],{"class":65},"-- Tablo ve index boyutları\n",[43,1727,1728,1730],{"class":45,"line":712},[43,1729,1138],{"class":83},[43,1731,1732],{"class":509}," relname,\n",[43,1734,1735,1738,1740],{"class":45,"line":944},[43,1736,1737],{"class":509},"       pg_size_pretty(pg_total_relation_size(relid)) ",[43,1739,1268],{"class":83},[43,1741,1742],{"class":509}," total\n",[43,1744,1745,1747],{"class":45,"line":967},[43,1746,1288],{"class":83},[43,1748,1749],{"class":509}," pg_catalog.pg_statio_user_tables\n",[43,1751,1752,1754,1757],{"class":45,"line":982},[43,1753,1222],{"class":83},[43,1755,1756],{"class":509}," pg_total_relation_size(relid) ",[43,1758,1759],{"class":83},"DESC\n",[43,1761,1762,1764,1767],{"class":45,"line":1250},[43,1763,1227],{"class":83},[43,1765,1766],{"class":83}," 10",[43,1768,531],{"class":509},[43,1770,1771],{"class":45,"line":1285},[43,1772,553],{"emptyLinePlaceholder":552},[43,1774,1776,1778,1781,1783,1786,1788],{"class":45,"line":1775},18,[43,1777,1138],{"class":83},[43,1779,1780],{"class":509}," pg_size_pretty(pg_database_size(",[43,1782,528],{"class":101},[43,1784,1785],{"class":52},"appdb",[43,1787,528],{"class":101},[43,1789,1790],{"class":509},"));\n",[10,1792,1794],{"id":1793},"_8-bakım","8. Bakım",[34,1796,1798],{"className":494,"code":1797,"language":496,"meta":39,"style":39},"VACUUM (VERBOSE, ANALYZE) users;   -- ölü satırları temizle, istatistikleri güncelle\nANALYZE;                           -- tüm tabloların planlayıcı istatistikleri\nREINDEX INDEX CONCURRENTLY idx_users_created_at;\nSHOW max_connections;\nSHOW config_file;\nSELECT version();\n",[19,1799,1800,1814,1822,1833,1838,1843],{"__ignoreMap":39},[43,1801,1802,1805,1808,1811],{"class":45,"line":46},[43,1803,1804],{"class":509},"VACUUM (",[43,1806,1807],{"class":83},"VERBOSE",[43,1809,1810],{"class":509},", ANALYZE) users;   ",[43,1812,1813],{"class":65},"-- ölü satırları temizle, istatistikleri güncelle\n",[43,1815,1816,1819],{"class":45,"line":69},[43,1817,1818],{"class":509},"ANALYZE;                           ",[43,1820,1821],{"class":65},"-- tüm tabloların planlayıcı istatistikleri\n",[43,1823,1824,1827,1830],{"class":45,"line":96},[43,1825,1826],{"class":509},"REINDEX ",[43,1828,1829],{"class":83},"INDEX",[43,1831,1832],{"class":509}," CONCURRENTLY idx_users_created_at;\n",[43,1834,1835],{"class":45,"line":111},[43,1836,1837],{"class":509},"SHOW max_connections;\n",[43,1839,1840],{"class":45,"line":129},[43,1841,1842],{"class":509},"SHOW config_file;\n",[43,1844,1845,1847,1850,1852],{"class":45,"line":585},[43,1846,1138],{"class":83},[43,1848,1849],{"class":83}," version",[43,1851,1105],{"class":101},[43,1853,531],{"class":509},[15,1855,1856,1857,1860,1861,1864],{},"Autovacuum varsayılan olarak açıktır ve çoğu durumda elle ",[19,1858,1859],{},"VACUUM"," gerekmez; ancak toplu silme\u002Fgüncelleme sonrasında ",[19,1862,1863],{},"VACUUM ANALYZE"," çalıştırmak planlayıcının doğru kararlar vermesine yardımcı olur.",[10,1866,1868],{"id":1867},"_9-sorun-giderme","9. Sorun giderme",[189,1870,1871,1881],{},[192,1872,1873],{},[195,1874,1875,1878],{},[198,1876,1877],{},"Hata",[198,1879,1880],{},"Sebep \u002F Çözüm",[205,1882,1883,1897,1913,1930,1947,1961],{},[195,1884,1885,1890],{},[210,1886,1887],{},[19,1888,1889],{},"FATAL: password authentication failed",[210,1891,1892,1893,1896],{},"Şifre yanlış ya da ",[19,1894,1895],{},"pg_hba.conf"," yöntemi uyuşmuyor",[195,1898,1899,1904],{},[210,1900,1901],{},[19,1902,1903],{},"FATAL: no pg_hba.conf entry for host",[210,1905,1906,1907,1909,1910],{},"İstemci IP'si ",[19,1908,1895],{},"'ta yok; ekleyip ",[19,1911,1912],{},"SELECT pg_reload_conf();",[195,1914,1915,1920],{},[210,1916,1917],{},[19,1918,1919],{},"Connection refused",[210,1921,1922,1923,1926,1927],{},"Sunucu çalışmıyor ya da ",[19,1924,1925],{},"listen_addresses"," sadece ",[19,1928,1929],{},"localhost",[195,1931,1932,1937],{},[210,1933,1934],{},[19,1935,1936],{},"permission denied for table",[210,1938,1939,1942,1943,1946],{},[19,1940,1941],{},"GRANT SELECT\u002FINSERT ..."," eksik; ",[19,1944,1945],{},"\\dp tablo"," ile kontrol edin",[195,1948,1949,1954],{},[210,1950,1951],{},[19,1952,1953],{},"too many connections",[210,1955,1956,1957,1960],{},"Uygulamada connection pool kullanın (HikariCP, PgBouncer); ",[19,1958,1959],{},"max_connections","'ı körü körüne artırmayın",[195,1962,1963,1966],{},[210,1964,1965],{},"Sorgu takılı kaldı",[210,1967,1968,1971,1972,1975],{},[19,1969,1970],{},"pg_stat_activity"," ve ",[19,1973,1974],{},"pg_locks"," ile bloklayan sorguyu bulun",[10,1977,1979],{"id":1978},"sonuç","Sonuç",[15,1981,1982,1984,1985,1044,1987,1044,1990,1044,1992,1044,1995,1044,1997,1999,2000,2003,2004,2007,2008,2010],{},[19,1983,21],{},"'in meta komutlarını (",[19,1986,214],{},[19,1988,1989],{},"\\c",[19,1991,244],{},[19,1993,1994],{},"\\d",[19,1996,328],{},[19,1998,338],{},") öğrenmek, veritabanında gezinmeyi GUI'den daha hızlı hale getirir. Bunun üzerine ",[19,2001,2002],{},"pg_dump -Fc"," ile düzenli yedek, ",[19,2005,2006],{},"EXPLAIN ANALYZE"," ile sorgu analizi ve ",[19,2009,1970],{}," ile canlı izleme eklendiğinde, PostgreSQL ile ilgili günlük işlerin büyük kısmı tek bir terminalden yürür.",[2012,2013,2014],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":39,"searchDepth":69,"depth":69,"links":2016},[2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027],{"id":12,"depth":69,"text":13},{"id":31,"depth":69,"text":32},{"id":183,"depth":69,"text":184},{"id":490,"depth":69,"text":491},{"id":742,"depth":69,"text":743},{"id":1004,"depth":69,"text":1005},{"id":1309,"depth":69,"text":1310},{"id":1527,"depth":69,"text":1528},{"id":1793,"depth":69,"text":1794},{"id":1867,"depth":69,"text":1868},{"id":1978,"depth":69,"text":1979},"2026-11-02","psql ile bağlanma, meta komutlar (\\l, \\dt, \\d), kullanıcı ve yetki yönetimi, yedekleme\u002Fgeri yükleme, sorgu analizi ve günlük bakım komutları.","md",{},"\u002Ftr\u002Fblog\u002Fpostgresql-psql-commands",{"title":5,"description":2029},"tr\u002Fblog\u002Fpostgresql-psql-commands",[2036,2037,2038],"postgresql","veritabanı","rehber","\u002Fen\u002Fblog\u002Fpostgresql-psql-commands","Rl6PBrf_INwFa_I52dU7gqObNJ16ZMpXVq3i8Uzudhg",[2042,2049,2058],{"path":2043,"title":2044,"description":2045,"date":2046,"tags":2047},"\u002Ftr\u002Fblog\u002Fjava-21-features","Java 21 Yenilikleri: Virtual Threads, Records ve Pattern Matching","Java 21 LTS ile gelen ve günlük kodu en çok değiştiren özellikler — virtual threads, record'lar, switch pattern matching, record pattern'leri, sealed sınıflar ve sequenced collections.","2026-11-01",[2048,2038],"java",{"path":2050,"title":2051,"description":2052,"date":2053,"tags":2054},"\u002Ftr\u002Fblog\u002Fssh-config-and-tunneling","SSH Config, Anahtar Yönetimi ve Tünelleme","ed25519 anahtar üretmek, ssh-agent, ~\u002F.ssh\u002Fconfig ile kısayollar, jump host, port yönlendirme (-L, -R, -D) ve sunucu tarafı güvenlik ayarları.","2026-10-31",[2055,2056,2057,2038],"ssh","linux","güvenlik",{"path":2059,"title":2060,"description":2061,"date":2062,"tags":2063},"\u002Ftr\u002Fblog\u002Fsystemd-service-guide","systemd ile Linux Servisi Yazmak","Bir uygulamayı systemd servisi olarak çalıştırmak — unit dosyası, restart politikası, ortam değişkenleri, journalctl ile log okuma ve timer ile zamanlanmış görevler.","2026-10-30",[2056,2064,2065,2038],"systemd","devops",1793579796727]