{"id":1947,"date":"2025-11-16T22:30:09","date_gmt":"2025-11-16T19:30:09","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/uygulama%e2%80%91tutarli-yedekler-nasil-alinir-lvm-snapshot-ve-fsfreeze-ile-mysql-postgresqli-usutmeden-dondurmak\/"},"modified":"2025-11-16T22:30:09","modified_gmt":"2025-11-16T19:30:09","slug":"uygulama%e2%80%91tutarli-yedekler-nasil-alinir-lvm-snapshot-ve-fsfreeze-ile-mysql-postgresqli-usutmeden-dondurmak","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/uygulama%e2%80%91tutarli-yedekler-nasil-alinir-lvm-snapshot-ve-fsfreeze-ile-mysql-postgresqli-usutmeden-dondurmak\/","title":{"rendered":"Uygulama\u2011Tutarl\u0131 Yedekler Nas\u0131l Al\u0131n\u0131r? LVM Snapshot ve fsfreeze ile MySQL\/PostgreSQL\u2019i \u00dc\u015f\u00fctmeden Dondurmak"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#Hikayeyle_Baslayalim_Disk_Isigi_Gece_Sessizligi_ve_O_Anki_Kalp_Carpintisi\"><span class=\"toc_number toc_depth_1\">1<\/span> Hik\u00e2yeyle Ba\u015flayal\u0131m: Disk I\u015f\u0131\u011f\u0131, Gece Sessizli\u011fi ve O Anki Kalp \u00c7arp\u0131nt\u0131s\u0131<\/a><\/li><li><a href=\"#Neden_UygulamaTutarli_O_Ince_Cizgiyi_Konusalim\"><span class=\"toc_number toc_depth_1\">2<\/span> Neden Uygulama\u2011Tutarl\u0131? O \u0130nce \u00c7izgiyi Konu\u015fal\u0131m<\/a><\/li><li><a href=\"#LVM_Snapshotin_Kalbi_COW_Mantigi_Kucuk_Pencereler_ve_Dikkat_Puanlari\"><span class=\"toc_number toc_depth_1\">3<\/span> LVM Snapshot\u2019\u0131n Kalbi: COW Mant\u0131\u011f\u0131, K\u00fc\u00e7\u00fck Pencereler ve Dikkat Puanlar\u0131<\/a><\/li><li><a href=\"#fsfreeze_Dugmeye_Bas_Kipirdama_Isimiz_Bitince_Devam\"><span class=\"toc_number toc_depth_1\">4<\/span> fsfreeze: D\u00fc\u011fmeye Bas, K\u0131p\u0131rdama; \u0130\u015fimiz Bitince Devam<\/a><\/li><li><a href=\"#MySQLde_Sicak_Yedek_Kilitle_Dondur_Fotografi_Cek_Devam\"><span class=\"toc_number toc_depth_1\">5<\/span> MySQL\u2019de S\u0131cak Yedek: Kilitle, Dondur, Foto\u011fraf\u0131 \u00c7ek, Devam<\/a><\/li><li><a href=\"#PostgreSQLde_Sicak_Yedek_Backup_Baslat_Dondur_Snapshot_Bitir\"><span class=\"toc_number toc_depth_1\">6<\/span> PostgreSQL\u2019de S\u0131cak Yedek: Backup Ba\u015flat, Dondur, Snapshot, Bitir<\/a><\/li><li><a href=\"#Geri_Donusu_Simdiden_Dusun_Snapshottan_Restore_ve_Prova\"><span class=\"toc_number toc_depth_1\">7<\/span> Geri D\u00f6n\u00fc\u015f\u00fc \u015eimdiden D\u00fc\u015f\u00fcn: Snapshot\u2019tan Restore ve Prova<\/a><\/li><li><a href=\"#Otomasyon_Zamanlama_ve_Ani_Yakalama_Kucuk_Script_Buyuk_Huzur\"><span class=\"toc_number toc_depth_1\">8<\/span> Otomasyon, Zamanlama ve An\u0131 Yakalama: K\u00fc\u00e7\u00fck Script, B\u00fcy\u00fck Huzur<\/a><\/li><li><a href=\"#Sik_Yapilan_Hatalar_ve_Tatli_Uyarilar\"><span class=\"toc_number toc_depth_1\">9<\/span> S\u0131k Yap\u0131lan Hatalar ve Tatl\u0131 Uyar\u0131lar<\/a><\/li><li><a href=\"#Ek_Okumalarla_Ufku_Genislet\"><span class=\"toc_number toc_depth_1\">10<\/span> Ek Okumalarla Ufku Geni\u015flet<\/a><\/li><li><a href=\"#Kapanis_Sahne_Isiklari_Sonmeden_Son_Bir_Derin_Nefes\"><span class=\"toc_number toc_depth_1\">11<\/span> Kapan\u0131\u015f: Sahne I\u015f\u0131klar\u0131 S\u00f6nmeden Son Bir Derin Nefes<\/a><\/li><\/ul><\/div>\n<h2 id=\"section-1\"><span id=\"Hikayeyle_Baslayalim_Disk_Isigi_Gece_Sessizligi_ve_O_Anki_Kalp_Carpintisi\">Hik\u00e2yeyle Ba\u015flayal\u0131m: Disk I\u015f\u0131\u011f\u0131, Gece Sessizli\u011fi ve O Anki Kalp \u00c7arp\u0131nt\u0131s\u0131<\/span><\/h2>\n<p>Hi\u00e7 ba\u015f\u0131na geldi mi? Gece ofiste tek ba\u015f\u0131nas\u0131n, sunucunun \u00fczerindeki o minik disk \u0131\u015f\u0131\u011f\u0131 ritmini tutturmu\u015f, arada bir daha h\u0131zl\u0131 yan\u0131p s\u00f6n\u00fcyor. Tam kahveni yudumlayacakken bir uyar\u0131 d\u00fc\u015f\u00fcyor: \u201c\u00dcretimde bir tablo yanl\u0131\u015fl\u0131kla g\u00fcncellendi, geri almam\u0131z laz\u0131m.\u201d O an i\u00e7ini k\u00fc\u00e7\u00fck bir \u00fcrperti kapl\u0131yor. Yede\u011fin var, evet; ama o yedek, uygulaman\u0131n g\u00f6z\u00fcnden bak\u0131nca ger\u00e7ekten tutarl\u0131 m\u0131? Veritaban\u0131n\u0131n haf\u0131zas\u0131ndaki i\u015flemler diskle ayn\u0131 noktada m\u0131? \u0130\u015fte tam burada \u201cuygulama\u2011tutarl\u0131\u201d yedek ile \u201c\u00e7\u00f6kme tutarl\u0131\u201d yedek aras\u0131ndaki fark hayati oluyor.<\/p>\n<p>Bu yaz\u0131da, LVM snapshot ve <strong>fsfreeze<\/strong> kullanarak MySQL ve PostgreSQL \u00fczerinde s\u0131cak, yani sistem \u00e7al\u0131\u015f\u0131rken yedek alman\u0131n yolunu, ad\u0131m ad\u0131m ve i\u00e7imizi ferahlatacak \u015fekilde anlatmak istiyorum. Mesela \u015f\u00f6yle d\u00fc\u015f\u00fcn; sistem nefes al\u0131p vermeyi kesmeden, ama o bir saniyelik foto\u011fraf karesi p\u0131r\u0131l p\u0131r\u0131l netsin istiyoruz. \u0130\u015fin sihri de burada. Bir yandan komutlar ve k\u00fc\u00e7\u00fck hileler, bir yandan da sahada i\u015fe yarayan pratikler. Yaz\u0131n\u0131n sonunda, yaln\u0131zca nas\u0131l snapshot alaca\u011f\u0131n\u0131 de\u011fil, al\u0131nan yede\u011fi nas\u0131l g\u00fcvenle geri d\u00f6nd\u00fcrece\u011fini ve s\u00fcreci nas\u0131l otomatikle\u015ftirece\u011fini de netle\u015ftirmi\u015f olaca\u011f\u0131z.<\/p>\n<h2 id=\"section-2\"><span id=\"Neden_UygulamaTutarli_O_Ince_Cizgiyi_Konusalim\">Neden Uygulama\u2011Tutarl\u0131? O \u0130nce \u00c7izgiyi Konu\u015fal\u0131m<\/span><\/h2>\n<p>Bir dosya sistemini anl\u0131k g\u00f6r\u00fcnt\u00fcyle yakalad\u0131\u011f\u0131nda, bazen foto\u011frafta g\u00f6z k\u0131rpan biri \u00e7\u0131kar. Veritabanlar\u0131 da \u00f6yle; bellek ve disk aras\u0131nda anl\u0131k bir trafik var. Sadece disk seviyesinde \u201c\u00e7\u00f6kme tutarl\u0131\u201d bir g\u00f6r\u00fcnt\u00fc almak, sistem sanki ani elektrik kesilmi\u015f gibi kabul edilebilir; ama transaction i\u00e7indeki bir kay\u0131t, uygulaman\u0131n bekledi\u011fi s\u0131rayla yaz\u0131lmam\u0131\u015f olabilir. Bu da geri d\u00f6nd\u00fc\u011f\u00fcnde k\u00fc\u00e7\u00fck s\u00fcrprizlere yol a\u00e7ar. Kimi zaman loglarla toparlan\u0131r, kimi zaman toparlanmaz. Uygulama\u2011tutarl\u0131 yedek ise, veritaban\u0131n\u0131n \u201ctamam, \u015fimdi poz veriyorum\u201d dedi\u011fi and\u0131r. MySQL\u2019de kilitleyip temiz bir noktada dondurmak, PostgreSQL\u2019de backup ba\u015flat\u0131p dosya sistemini dondurmak gibi ufak ama kritik hamlelerle o pozu yakalar\u0131z.<\/p>\n<p>Avantaj\u0131 \u00e7ok net: Geri d\u00f6n\u00fc\u015fte daha az ter, daha az nefes kesilmesi ve daha h\u0131zl\u0131 aya\u011fa kalkma. Dezavantaj\u0131 m\u0131? Sahneyi kurmak i\u00e7in k\u00fc\u00e7\u00fck bir koreografi gerekiyor. \u00d6yle saniyelerle yar\u0131\u015ft\u0131\u011f\u0131m\u0131z bir dans, ama sahne \u0131\u015f\u0131klar\u0131 do\u011fru ayarlan\u0131rsa kimse fark etmeden perde kapan\u0131p a\u00e7\u0131l\u0131yor. \u00dcstelik iyi bir planlamayla bu k\u00fc\u00e7\u00fck dondurma an\u0131, kullan\u0131c\u0131lar\u0131n fark etmeyece\u011fi kadar k\u0131sa s\u00fcrer.<\/p>\n<h2 id=\"section-3\"><span id=\"LVM_Snapshotin_Kalbi_COW_Mantigi_Kucuk_Pencereler_ve_Dikkat_Puanlari\">LVM Snapshot\u2019\u0131n Kalbi: COW Mant\u0131\u011f\u0131, K\u00fc\u00e7\u00fck Pencereler ve Dikkat Puanlar\u0131<\/span><\/h2>\n<p>LVM snapshot\u2019\u0131, \u00e7al\u0131\u015fan bir logical volume\u2019un anl\u0131k foto\u011fraf\u0131n\u0131 al\u0131r. Arkadaki b\u00fcy\u00fc, copy\u2011on\u2011write denen mant\u0131kt\u0131r. \u00d6zetle \u015funu yapar: Sen foto\u011fraf\u0131 \u00e7ektikten sonra veriler de\u011fi\u015fmeye devam eder ama snapshot g\u00fc\u00e7l\u00fc bir haf\u0131zaya sahiptir; de\u011fi\u015fecek bloklar\u0131 kendi alan\u0131na kopyalar, b\u00f6ylece foto\u011fraf\u0131n bozulmaz. Bu y\u00fczden snapshot i\u00e7in ay\u0131rd\u0131\u011f\u0131n alan \u00e7ok \u00f6nemlidir. E\u011fer bu alan dolar da ta\u015farsa, foto\u011fraf bulan\u0131kla\u015f\u0131r, yedek bozulur. O y\u00fczden \u00e7ekti\u011fin resmi h\u0131zl\u0131ca ba\u015fka bir yere kopyalamak ve snapshot\u2019\u0131 uzun s\u00fcre a\u00e7\u0131k b\u0131rakmamak iyi bir al\u0131\u015fkanl\u0131kt\u0131r.<\/p>\n<p>Bir ba\u015fka k\u00fc\u00e7\u00fck not: Veritaban\u0131 dizininin m\u00fcmk\u00fcnse kendi logical volume\u2019u \u00fczerinde olmas\u0131 i\u015fleri tatl\u0131la\u015ft\u0131r\u0131r. B\u00f6ylece yaln\u0131zca gerekti\u011fi yeri dondurur, sistemi komple durdurmazs\u0131n. XFS veya ext4 gibi dosya sistemleriyle <strong>fsfreeze<\/strong> g\u00fczel \u00e7al\u0131\u015f\u0131r. Root dosya sistemini dondurmak gibi cesur hamlelerden uzak dur, yoksa kendi aya\u011f\u0131na basm\u0131\u015f olursun. Ayr\u0131ca snapshot al\u0131rken I\/O\u2019ya ufak bir maliyet biner; foto\u011fraf \u00e7ekmek bedava de\u011fil ama do\u011fru boyutland\u0131rmayla hissedilmez hale gelir.<\/p>\n<p>Komut taraf\u0131nda en temel hareket \u015fudur: var olan bir LV\u2019nin snapshot\u2019\u0131n\u0131 almak. Mesela veritaban\u0131 dizinin \u201cvg0\/data\u201d adl\u0131 bir LV\u2019de oldu\u011funu varsayal\u0131m. O foto\u011fraf\u0131 \u015f\u00f6yle \u00e7ekersin:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">lvcreate -s -L 10G -n data_snap \/dev\/vg0\/data\n<\/code><\/pre>\n<p>Buradaki 10G snapshot i\u00e7in ayr\u0131lm\u0131\u015f alan\u0131 anlat\u0131r. B\u00fcy\u00fckl\u00fc\u011f\u00fcn\u00fc, sistemde beklenen yazma trafi\u011fine ve snapshot\u2019\u0131 ne kadar s\u00fcre a\u00e7\u0131k tutaca\u011f\u0131na g\u00f6re se\u00e7ersin. Snapshot al\u0131n\u0131r al\u0131nmaz onu ayr\u0131 bir noktaya read\u2011only olarak ba\u011flay\u0131p, kopyan\u0131 al\u0131p, sonra snapshot\u2019\u0131 silmek en temiz ak\u0131\u015f.<\/p>\n<h2 id=\"section-4\"><span id=\"fsfreeze_Dugmeye_Bas_Kipirdama_Isimiz_Bitince_Devam\">fsfreeze: D\u00fc\u011fmeye Bas, K\u0131p\u0131rdama; \u0130\u015fimiz Bitince Devam<\/span><\/h2>\n<p><strong>fsfreeze<\/strong>, dosya sistemine \u201cbir saniyecik bekler misin\u201d der. O k\u0131sa esnada yazma i\u015flemleri ask\u0131ya al\u0131n\u0131r, dosya sistemi sabitlenir. Ger\u00e7ekten buz kesmez ama hareketi durdurur. Biz de bu arada LVM snapshot\u2019\u0131 \u00e7at diye al\u0131r\u0131z. Sonra buzlar\u0131 \u00e7\u00f6zer, hayat kald\u0131\u011f\u0131 yerden akar. \u00d6nemli olan o pencereyi k\u0131sa tutmak. \u00c7\u00fcnk\u00fc bu k\u0131sa bekleme an\u0131nda yazmaya \u00e7al\u0131\u015fan uygulamalar kuyru\u011fa girer. K\u0131sa tutarsan sorun de\u011fil, kimse fark etmeyecek.<\/p>\n<p>fsfreeze komutu basit g\u00f6r\u00fcn\u00fcr ama etkisi b\u00fcy\u00fck. Mount noktas\u0131n\u0131 bilmen yeterli:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># Dondur\nfsfreeze -f \/var\/lib\/mysql\n\n# \u00c7\u00f6z\nfsfreeze -u \/var\/lib\/mysql\n<\/code><\/pre>\n<p>Detaylar\u0131na merak edenler i\u00e7in k\u0131lavuz sayfas\u0131 gayet a\u00e7\u0131klay\u0131c\u0131; merak edersen <a href=\"https:\/\/man7.org\/linux\/man-pages\/man8\/fsfreeze.8.html\" rel=\"nofollow noopener\" target=\"_blank\">fsfreeze ile ilgili bu belgeyi<\/a> bir kenara a\u00e7abilirsin. Ufak bir uyar\u0131; container i\u00e7indeysen, alt\u0131ndaki dosya sisteminin ger\u00e7ekten dondurulabilir oldu\u011fundan emin ol. Bazen overlay veya a\u011f dosya sistemleri bu i\u015fi sevmez. \u00c7\u00f6z\u00fcm, en alttaki ger\u00e7ek mount noktas\u0131nda \u00e7al\u0131\u015fmak ya da i\u015fin snapshot k\u0131sm\u0131n\u0131 host seviyesinde y\u00f6netmek.<\/p>\n<h2 id=\"section-5\"><span id=\"MySQLde_Sicak_Yedek_Kilitle_Dondur_Fotografi_Cek_Devam\">MySQL\u2019de S\u0131cak Yedek: Kilitle, Dondur, Foto\u011fraf\u0131 \u00c7ek, Devam<\/span><\/h2>\n<p>MySQL taraf\u0131nda ama\u00e7, o kareyi uygulaman\u0131n onay\u0131yla yakalamak. InnoDB kulland\u0131\u011f\u0131n\u0131 varsayal\u0131m. Uygun bir an yaratmak i\u00e7in k\u0131sa s\u00fcreli bir kilit kullan\u0131r\u0131z. Bu, uzun s\u00fcrmeyecek ve genelde hissedilmeyecek. Ak\u0131\u015f \u015f\u00f6yle d\u00fc\u015f\u00fcnebilirsin: MySQL\u2019e \u201cbir an dur, nefes al\u201d deriz, dosya sistemini dondururuz, snapshot\u2019\u0131 al\u0131r\u0131z, hemen \u00e7\u00f6z\u00fcp devam ettiririz.<\/p>\n<p>\u00d6rnek ak\u0131\u015f, root ya da gerekli yetkilere sahip bir kullan\u0131c\u0131yla:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># 1) MySQL'e ba\u011flan ve yaz\u0131lar\u0131 kilitle\nmysql -e &quot;FLUSH TABLES WITH READ LOCK; FLUSH LOGS;&quot;\n\n# 2) Dosya sistemini dondur (\u00f6rnek mount: \/var\/lib\/mysql)\nfsfreeze -f \/var\/lib\/mysql\n\n# 3) Snapshot'\u0131 al\nlvcreate -s -L 10G -n mysql_snap \/dev\/vg0\/mysql\n\n# 4) Dosya sistemini \u00e7\u00f6z\nfsfreeze -u \/var\/lib\/mysql\n\n# 5) MySQL'de kilidi b\u0131rak\nmysql -e &quot;UNLOCK TABLES;&quot;\n<\/code><\/pre>\n<p>Bu kadar. Art\u0131k snapshot\u2019\u0131n\u0131 \/dev\/vg0\/mysql_snap olarak g\u00f6r\u00fcrs\u00fcn. Bunu read\u2011only ba\u011flay\u0131p, g\u00fcvenli bir dizine kopyalayabilirsin. Kopyalama i\u00e7in rsync ile sadece okuyarak aktarmak iyi bir pratik. Snapshot\u2019\u0131 ba\u011flamak i\u00e7in:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">mkdir -p \/mnt\/mysql_snap\nmount -o ro \/dev\/vg0\/mysql_snap \/mnt\/mysql_snap\nrsync -aH --numeric-ids \/mnt\/mysql_snap\/ \/mnt\/backup\/mysql-$(date +%F)\/\numount \/mnt\/mysql_snap\nlvremove -y \/dev\/vg0\/mysql_snap\n<\/code><\/pre>\n<p>E\u011fer binary log tutuyorsan ve loglar\u0131 yedeklemenin bir par\u00e7as\u0131 yapt\u0131ysan, nokta at\u0131\u015f\u0131 zamanda geri d\u00f6n\u00fc\u015f ihtimalin artar. Bu arada MySQL\u2019in farkl\u0131 s\u00fcr\u00fcmlerinde \u201cLOCK INSTANCE FOR BACKUP\u201d gibi daha \u201cbackup dostu\u201d kilitleme se\u00e7enekleri de var. Detaylar\u0131nda bo\u011fulmak istemeyenler i\u00e7in \u00f6zet \u015fu: Kilit k\u0131sa s\u00fcrs\u00fcn, snapshot h\u0131zl\u0131 al\u0131ns\u0131n, snapshot hemen kopyalans\u0131n. \u0130stersen <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/backup-methods.html\" rel=\"nofollow noopener\" target=\"_blank\">MySQL\u2019in yedekleme y\u00f6ntemlerine genel bak\u0131\u015f\u0131<\/a> buradan g\u00f6z at\u0131p, kulland\u0131\u011f\u0131n s\u00fcr\u00fcme uygun komutu se\u00e7ebilirsin.<\/p>\n<p>Bir ufac\u0131k not daha: Datadir\u2019in ve ib_logfile gibi kritik dosyalar\u0131n ayn\u0131 LV\u2019de olmas\u0131na dikkat. Par\u00e7al\u0131 mimarilerde her par\u00e7a i\u00e7in ayn\u0131 anda snapshot gerekebilir, bu y\u00fczden tasar\u0131m\u0131 sade tutmak i\u015fini kolayla\u015ft\u0131r\u0131r. \u0130\u015fin g\u00fczel taraf\u0131, do\u011fru uyguland\u0131\u011f\u0131nda bu y\u00f6ntem \u00fcretimde kullan\u0131c\u0131lar\u0131n fark etmeyece\u011fi kadar k\u0131sa bir an\u0131 kapl\u0131yor.<\/p>\n<h2 id=\"section-6\"><span id=\"PostgreSQLde_Sicak_Yedek_Backup_Baslat_Dondur_Snapshot_Bitir\">PostgreSQL\u2019de S\u0131cak Yedek: Backup Ba\u015flat, Dondur, Snapshot, Bitir<\/span><\/h2>\n<p>PostgreSQL biraz farkl\u0131 bir kural seti istiyor. O da poz vermek istiyor ama \u201cbana haber ver\u201d diyor. K\u0131saca \u015funu yapar\u0131z: \u201cBackup\u2019\u0131 ba\u015flat\u201d komutunu \u00e7al\u0131\u015ft\u0131r\u0131r\u0131z, dosya sistemini dondurur, snapshot\u2019\u0131 al\u0131r, dosya sistemini \u00e7\u00f6zer, \u201cbackup bitti\u201d deriz. Bu ak\u0131\u015f s\u0131ras\u0131nda WAL dosyalar\u0131n\u0131n tamaml\u0131\u011f\u0131n\u0131 da garanti alt\u0131na almak i\u00e7in ar\u015fivlemeyi a\u00e7\u0131k tutmak ak\u0131ll\u0131ca. B\u00f6ylece snapshot\u2019tan d\u00f6nerken aradaki hareketleri WAL\u2019lerden yakalar, eksik bir kare kalmaz.<\/p>\n<p>\u00d6n ko\u015fullar \u00e7ok karma\u015f\u0131k de\u011fil. postgresql.conf i\u00e7inde wal_level\u2019in en az\u0131ndan replica, archive_mode\u2019un on, archive_command\u2019\u0131n da ger\u00e7ek\u00e7i bir hedefe yaz\u0131yor olmas\u0131 g\u00fczel bir ba\u015flang\u0131\u00e7. Sonras\u0131 ak\u0131\u015f:<\/p>\n<pre class=\"language-sql line-numbers\"><code class=\"language-sql\"># 1) Backup oturumunu ba\u015flat (psql i\u00e7inde):\nSELECT pg_backup_start('lvm-snapshot', true);\n\n# 2) Dosya sistemini dondur (\u00f6rnek mount: \/var\/lib\/postgresql\/15\/main)\nfsfreeze -f \/var\/lib\/postgresql\/15\/main\n\n# 3) Snapshot'\u0131 al\nlvcreate -s -L 10G -n pgdata_snap \/dev\/vg0\/pgdata\n\n# 4) Dosya sistemini \u00e7\u00f6z\nfsfreeze -u \/var\/lib\/postgresql\/15\/main\n\n# 5) Backup'\u0131 bitir (psql i\u00e7inde):\nSELECT pg_backup_stop();\n<\/code><\/pre>\n<p>Ard\u0131ndan snapshot\u2019\u0131 read\u2011only ba\u011flar, g\u00fcvenli bir dizine kopyalars\u0131n. Bu esnada WAL ar\u015fivinin de akmaya devam etti\u011finden emin olmak, restore an\u0131nda eksiksiz toparlama sa\u011flar. PostgreSQL\u2019in dosya kopyalama temelli yedekleme \u00f6nerileri net; ayr\u0131nt\u0131 merak edenler i\u00e7in <a href=\"https:\/\/www.postgresql.org\/docs\/current\/backup-file.html\" rel=\"nofollow noopener\" target=\"_blank\">resmi belgedeki dosya sistemi yede\u011fi b\u00f6l\u00fcm\u00fc<\/a> birebir bu ak\u0131\u015f\u0131 tarif eder. Mesela \u015f\u00f6yle d\u00fc\u015f\u00fcn\u00fcn; bir film sahnesi \u00e7ekiyorsun, y\u00f6netmen \u201ckestik\u201d diyor, kameraman freeze tu\u015funa bas\u0131p bir kare yakal\u0131yor, sonra devam. \u0130\u015fte bu kadar do\u011fal.<\/p>\n<p>Bir \u00f6nemli ayr\u0131nt\u0131 daha var. E\u011fer tablespace\u2019leri ayr\u0131 L\u2019Vlere da\u011f\u0131tt\u0131ysan, hepsini ayn\u0131 anda dondurup ayn\u0131 anda snapshot almak gerekebilir. En sa\u011fl\u0131kl\u0131s\u0131, PGDATA ve varsa tablespace\u2019lerin ayn\u0131 volume grubu i\u00e7inde ve senkronize snapshot alabilecek \u015fekilde tasarlanmas\u0131. Bu planlamay\u0131 ba\u015fta yaparsan, sahnede zihin kar\u0131\u015f\u0131kl\u0131\u011f\u0131 ya\u015famazs\u0131n.<\/p>\n<h2 id=\"section-7\"><span id=\"Geri_Donusu_Simdiden_Dusun_Snapshottan_Restore_ve_Prova\">Geri D\u00f6n\u00fc\u015f\u00fc \u015eimdiden D\u00fc\u015f\u00fcn: Snapshot\u2019tan Restore ve Prova<\/span><\/h2>\n<p>Yedek almak g\u00fczel de, onu d\u00f6nd\u00fcrece\u011fin g\u00fcn\u00fc de d\u00fc\u015f\u00fcnmek gerekir. Bu y\u00fczden ben genelde haftada en az bir kez \u201cprova restore\u201d yapar\u0131m. \u00dcretimle ayn\u0131 s\u00fcr\u00fcmde bir test sunucusu ay\u0131r\u0131r, al\u0131nan snapshot\u2019tan kopyalanan yede\u011fi oraya kurar, uygulamay\u0131 aya\u011fa kald\u0131r\u0131r\u0131m. S\u00fcrprizler sahnede de\u011fil prova odas\u0131nda kals\u0131n diye.<\/p>\n<p>MySQL\u2019de d\u00f6n\u00fc\u015f genelde \u015fu \u015fekilde olur: Yedek dizinini yeni bir sunucuda datadir olarak yerle\u015ftirirsin, izinleri ve kullan\u0131c\u0131y\u0131 d\u00fczeltirsin, my.cnf i\u00e7indeki yollar\u0131 do\u011frular, sonra MySQL\u2019i ba\u015flat\u0131rs\u0131n. E\u011fer binary log\u2019larla noktaya d\u00f6n\u00fc\u015f yapacaksan, snapshot noktas\u0131ndaki position\u2019\u0131 i\u015faret eden notlar\u0131n\u0131 referans al\u0131rs\u0131n. PostgreSQL\u2019de ise recovery taraf\u0131nda WAL\u2019leri sa\u011flayacak \u015fekilde restore_command ayarlars\u0131n, recovery.signal dokunursun, sonra ba\u015flat\u0131rs\u0131n. Sistem WAL\u2019leri \u00e7ektik\u00e7e o anki kareye do\u011fru kendini tamamlar.<\/p>\n<p>Basit bir rsync ile restore kopyas\u0131n\u0131 almak bile \u00e7o\u011fu zaman yeterli. Yeter ki hedef dizini do\u011fru ba\u011fla, izinleri d\u00fczelt, servisleri ba\u015flatmadan \u00f6nce konfig\u00fcrasyonlar\u0131 g\u00f6zden ge\u00e7ir. Kula\u011fa \u00e7ok kli\u015fe geliyor ama \u201cbackup\u2019\u0131 al, restore et, do\u011frula\u201d \u00fc\u00e7l\u00fcs\u00fc en iyi dostundur. Prova yapt\u0131k\u00e7a ger\u00e7ek hayattaki stres d\u00fczeyi d\u00fc\u015fer ve karar anlar\u0131nda bile elin titremez.<\/p>\n<h2 id=\"section-8\"><span id=\"Otomasyon_Zamanlama_ve_Ani_Yakalama_Kucuk_Script_Buyuk_Huzur\">Otomasyon, Zamanlama ve An\u0131 Yakalama: K\u00fc\u00e7\u00fck Script, B\u00fcy\u00fck Huzur<\/span><\/h2>\n<p>Bir s\u00fcre sonra bu i\u015fi elle yapmak yerine bir script ve zamanlay\u0131c\u0131ya ba\u011flamak isteyeceksin. \u0130\u015fin p\u00fcf noktas\u0131, hatay\u0131 g\u00f6rd\u00fc\u011f\u00fcnde zarif\u00e7e geri sarabilmesi. Mesela MySQL ak\u0131\u015f\u0131nda, kilit at\u0131ld\u0131ktan sonra herhangi bir ad\u0131m ba\u015far\u0131s\u0131z olursa fsfreeze \u00e7\u00f6z\u00fclmeli, kilit b\u0131rak\u0131lmal\u0131. PostgreSQL ak\u0131\u015f\u0131nda, backup ba\u015flat\u0131ld\u0131ktan sonra snapshot ba\u015far\u0131s\u0131zsa backup\u2019\u0131 durdurmay\u0131 unutmamal\u0131. Denetimi s\u0131k\u0131 ama k\u0131sa tutan bir script, g\u00fcn\u00fcn sonunda sana saatler kazand\u0131r\u0131r.<\/p>\n<p>\u00d6rnek bir MySQL script\u2019inin iskeleti \u015f\u00f6yle olabilir; fikir versin, birebir kopyalamadan \u00f6nce mutlaka kendi yollar\u0131na ve ko\u015fullar\u0131na g\u00f6re d\u00fczenle:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">#!\/bin\/bash\nset -euo pipefail\nMYSQL_MNT=&quot;\/var\/lib\/mysql&quot;\nLV_SRC=&quot;\/dev\/vg0\/mysql&quot;\nSNAP_NAME=&quot;mysql_snap_$(date +%F-%H%M%S)&quot;\nSNAP_LV=&quot;\/dev\/vg0\/${SNAP_NAME}&quot;\nBACKUP_DIR=&quot;\/mnt\/backup\/mysql-$(date +%F-%H%M%S)&quot;\ncleanup() { fsfreeze -u &quot;$MYSQL_MNT&quot; || true; mysql -e &quot;UNLOCK TABLES;&quot; || true; }\ntrap cleanup EXIT\nmysql -e &quot;FLUSH TABLES WITH READ LOCK; FLUSH LOGS;&quot;\nfsfreeze -f &quot;$MYSQL_MNT&quot;\nlvcreate -s -L 10G -n &quot;$SNAP_NAME&quot; &quot;$LV_SRC&quot;\nfsfreeze -u &quot;$MYSQL_MNT&quot;\nmysql -e &quot;UNLOCK TABLES;&quot;\nmkdir -p &quot;$BACKUP_DIR&quot;\nmount -o ro &quot;$SNAP_LV&quot; \/mnt\/snap\nrsync -aH --numeric-ids \/mnt\/snap\/ &quot;$BACKUP_DIR\/&quot;\numount \/mnt\/snap\nlvremove -y &quot;$SNAP_LV&quot;\n<\/code><\/pre>\n<p>Benzer bir iskeleti PostgreSQL i\u00e7in de kurars\u0131n. Orada psql ile pg_backup_start\/stop \u00e7a\u011fr\u0131lar\u0131n\u0131 koyar, freeze ve snapshot aras\u0131na al\u0131rs\u0131n. G\u00fcn\u00fcn sonunda bu script\u2019i systemd timer ile her gece \u00e7al\u0131\u015ft\u0131r\u0131r, log\u2019lar\u0131 da merkezi bir yere ak\u0131t\u0131rs\u0131n. E\u011fer uzak depolamaya g\u00f6ndereceksen, rsync sonras\u0131 rclone ile bir obje depolamaya, ya da SFTP ile uzak bir kasaya aktarmak iyi bir plan. Bu noktada felaket dayan\u0131kl\u0131l\u0131\u011f\u0131na geni\u015f a\u00e7\u0131dan bakmak istersen, replikasyon ve DNS y\u00f6nlendirmesiyle kombinledi\u011fim bir yaz\u0131da t\u00fcm resmi toparlam\u0131\u015ft\u0131m; merak edersen <a href=\"https:\/\/www.dchost.com\/blog\/cok-bolgeli-mimariler-nasil-kurulur-dns-geo%e2%80%91routing-ve-veritabani-replikasyonu-ile-korkusuz-felaket-dayanikliligi\/\">\u00e7ok b\u00f6lgeli mimariler ve felaket dayan\u0131kl\u0131l\u0131\u011f\u0131<\/a> k\u0131sm\u0131na bakabilirsin.<\/p>\n<h2 id=\"section-9\"><span id=\"Sik_Yapilan_Hatalar_ve_Tatli_Uyarilar\">S\u0131k Yap\u0131lan Hatalar ve Tatl\u0131 Uyar\u0131lar<\/span><\/h2>\n<p>En s\u0131k g\u00f6rd\u00fc\u011f\u00fcm aksakl\u0131k, snapshot alan\u0131n\u0131n k\u00fc\u00e7\u00fck b\u0131rak\u0131lmas\u0131. Foto\u011fraf \u00e7ekiyorsun, objektifin kapa\u011f\u0131 bir anda d\u00fc\u015f\u00fcyor gibi d\u00fc\u015f\u00fcn; yer dolunca COW tutmuyor. Bu y\u00fczden bekledi\u011fin yedek s\u00fcresi ve o s\u00fcre boyunca yazma h\u0131z\u0131na g\u00f6re yeterli alan ay\u0131r. Bir di\u011feri, uzun s\u00fcre snapshot\u2019\u0131 unutup b\u0131rakmak. Snapshot, kal\u0131c\u0131 yedek de\u011fil; an\u0131 yakalaman i\u00e7in bir ara\u00e7. \u00c7ek, kopyala, kald\u0131r. \u00dc\u00e7 ad\u0131m\u0131 h\u0131zl\u0131 uygula.<\/p>\n<p>Bir ba\u015fka s\u0131k\u0131nt\u0131, dosya sistemini dondurdu\u011funu san\u0131p asl\u0131nda farkl\u0131 bir mount noktas\u0131nda \u00e7al\u0131\u015fmak. \u00d6zellikle container k\u00f6kenli da\u011f\u0131t\u0131mlarda bu kar\u0131\u015fabiliyor. \u0130\u015fleme ba\u015flamadan \u00f6nce \u201cbu dizin nereye mount edilmi\u015f\u201d sorusuna cevap ver. Bir de \u015fu var: PostgreSQL\u2019de backup ba\u015flatmay\u0131 unutanlar, sonradan WAL bulamay\u0131nca eksik kareyle kal\u0131yor. Komut dizini k\u0131sa ama net yaz, her ad\u0131mdan sonra minimal kontrol koy. K\u00fc\u00e7\u00fck hatalar, b\u00fcy\u00fck gecelere d\u00f6n\u00fc\u015fmesin.<\/p>\n<h2 id=\"section-10\"><span id=\"Ek_Okumalarla_Ufku_Genislet\">Ek Okumalarla Ufku Geni\u015flet<\/span><\/h2>\n<p>Elinin alt\u0131nda iki kap\u0131 daha olsun istiyorsan, biri PostgreSQL\u2019in dosya temelli yedek anlat\u0131m\u0131, di\u011feri MySQL\u2019in kendi \u00f6nerileri. fsfreeze komutunun davran\u0131\u015f\u0131n\u0131 daha derinden merak edersen k\u0131lavuz sayfas\u0131 hem k\u0131sa hem \u00f6z. \u015e\u00f6yle kenara ili\u015ftiriyorum: <a href=\"https:\/\/www.postgresql.org\/docs\/current\/backup-file.html\" rel=\"nofollow noopener\" target=\"_blank\">PostgreSQL dosya sistemi yede\u011fi<\/a> ve <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/backup-methods.html\" rel=\"nofollow noopener\" target=\"_blank\">MySQL yedekleme y\u00f6ntemleri<\/a>. fsfreeze i\u00e7in de <a href=\"https:\/\/man7.org\/linux\/man-pages\/man8\/fsfreeze.8.html\" rel=\"nofollow noopener\" target=\"_blank\">k\u0131lavuz sayfas\u0131na<\/a> bakmak \u00e7o\u011fu soruyu da\u011f\u0131t\u0131r. Linkleri arada a\u00e7\u0131p kapars\u0131n, kafana tak\u0131lan her noktaya k\u00fc\u00e7\u00fck bir spot \u0131\u015f\u0131\u011f\u0131 tutarlar.<\/p>\n<h2 id=\"section-11\"><span id=\"Kapanis_Sahne_Isiklari_Sonmeden_Son_Bir_Derin_Nefes\">Kapan\u0131\u015f: Sahne I\u015f\u0131klar\u0131 S\u00f6nmeden Son Bir Derin Nefes<\/span><\/h2>\n<p>Toparlayal\u0131m. Uygulama\u2011tutarl\u0131 yedek dedi\u011fimiz \u015fey, veritaban\u0131na \u201c\u015fimdi poz ver\u201d dedirtebilmek. MySQL\u2019de k\u0131sa bir kilit ve log temizli\u011fi, PostgreSQL\u2019de backup ba\u015flang\u0131\u00e7\/biti\u015f sinyalleri, dosya sisteminde fsfreeze ile ufak bir duru\u015f ve LVM snapshot ile kareyi yakalama. Hepsi do\u011fru s\u0131rayla olunca, geri d\u00f6n\u00fc\u015fte ter d\u00f6kmeden aya\u011fa kalkars\u0131n. \u0130\u015fin \u015fifresi, an\u0131 uzatmamak, snapshot alan\u0131n\u0131 do\u011fru boyutlamak, yede\u011fi h\u0131zl\u0131ca g\u00fcvenli bir yere ta\u015f\u0131mak ve d\u00fczenli prova yapmakt\u0131r.<\/p>\n<p>E\u011fer bu ak\u0131\u015f\u0131 bir script ve zamanlay\u0131c\u0131yla s\u00fcsler, hata durumlar\u0131n\u0131 kibarca ele al\u0131rsan, geceleri sunucu ba\u015f\u0131nda beklemek yerine kahveni sakin i\u00e7ersin. Benim rutinim \u015f\u00f6yle: Her gece otomatik s\u0131cak yedek, haftada bir prova restore, ayda bir de tam bir geri d\u00f6n\u00fc\u015f sim\u00fclasyonu. K\u00fc\u00e7\u00fck ad\u0131mlar, b\u00fcy\u00fck huzur. Umar\u0131m bu anlat\u0131m sana ilham verir ve ilk snapshot yede\u011fini att\u0131\u011f\u0131nda o k\u00fc\u00e7\u00fck disk \u0131\u015f\u0131\u011f\u0131na g\u00fcl\u00fcmseyerek bakars\u0131n. Sorular\u0131n\u0131 not al; bir dahaki yaz\u0131da belki replikasyonla snapshot\u2019\u0131 birlikte ele al\u0131r, daha da sa\u011flam bir sahne kurar\u0131z. \u015eimdilik benden bu kadar, g\u00f6r\u00fc\u015fmek \u00fczere.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u0130&ccedil;indekiler1 Hik\u00e2yeyle Ba\u015flayal\u0131m: Disk I\u015f\u0131\u011f\u0131, Gece Sessizli\u011fi ve O Anki Kalp \u00c7arp\u0131nt\u0131s\u01312 Neden Uygulama\u2011Tutarl\u0131? O \u0130nce \u00c7izgiyi Konu\u015fal\u0131m3 LVM Snapshot\u2019\u0131n Kalbi: COW Mant\u0131\u011f\u0131, K\u00fc\u00e7\u00fck Pencereler ve Dikkat Puanlar\u01314 fsfreeze: D\u00fc\u011fmeye Bas, K\u0131p\u0131rdama; \u0130\u015fimiz Bitince Devam5 MySQL\u2019de S\u0131cak Yedek: Kilitle, Dondur, Foto\u011fraf\u0131 \u00c7ek, Devam6 PostgreSQL\u2019de S\u0131cak Yedek: Backup Ba\u015flat, Dondur, Snapshot, Bitir7 Geri D\u00f6n\u00fc\u015f\u00fc \u015eimdiden D\u00fc\u015f\u00fcn: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1948,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-1947","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1947","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=1947"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1947\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/1948"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=1947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=1947"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=1947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}