{"id":382,"date":"2026-08-30T11:51:03","date_gmt":"2026-08-30T11:51:03","guid":{"rendered":"https:\/\/www.vps.tc\/blog\/?p=382"},"modified":"2026-08-30T09:20:37","modified_gmt":"2026-08-30T09:20:37","slug":"vps-mysql-kurulumu-guvenli-yapilandirma","status":"publish","type":"post","link":"https:\/\/www.vps.tc\/blog\/tr\/vps-mysql-kurulumu-guvenli-yapilandirma\/","title":{"rendered":"VPS&#8217;te MySQL Kurulumu ve G\u00fcvenli Yap\u0131land\u0131rma"},"content":{"rendered":"<div class=\"aiw-toc\" style=\"border:1px solid #dbe3ea;border-radius:8px;padding:16px 20px;margin:0 0 28px\"><strong>\u0130\u00e7indekiler<\/strong><\/p>\n<ol style=\"margin:10px 0 0;padding-left:22px\">\n<li><a href=\"#vpste-mysql-kurmadan-once-bilmeniz-gerekenler\">VPS&#039;te MySQL kurmadan \u00f6nce bilmeniz gerekenler<\/a><\/li>\n<li><a href=\"#ubuntu-ve-debian-uzerinde-mysql-kurulumu\">Ubuntu ve Debian \u00fczerinde MySQL kurulumu<\/a><\/li>\n<li><a href=\"#ilk-guvenlik-adimlari\">\u0130lk g\u00fcvenlik ad\u0131mlar\u0131<\/a><\/li>\n<li><a href=\"#mysqli-internete-acmali-misiniz\">MySQL&#039;i internete a\u00e7mal\u0131 m\u0131s\u0131n\u0131z?<\/a><\/li>\n<li><a href=\"#root-parolasi-kimlik-dogrulama-ve-tls\">Root parolas\u0131, kimlik do\u011frulama ve TLS<\/a><\/li>\n<li><a href=\"#kaynak-kullanimi-ve-temel-mysql-yapilandirmasi\">Kaynak kullan\u0131m\u0131 ve temel MySQL yap\u0131land\u0131rmas\u0131<\/a><\/li>\n<li><a href=\"#yedekleme-olmadan-kurulum-tamamlanmis-sayilmaz\">Yedekleme olmadan kurulum tamamlanm\u0131\u015f say\u0131lmaz<\/a><\/li>\n<li><a href=\"#kurulumdan-sonra-kontrol-edilmesi-gerekenler\">Kurulumdan sonra kontrol edilmesi gerekenler<\/a><\/li>\n<li><a href=\"#uygulamanin-mysqle-baglanmasi\">Uygulaman\u0131n MySQL&#039;e ba\u011flanmas\u0131<\/a><\/li>\n<li><a href=\"#vps-mysql-kurulumu-icin-son-kontrol\">VPS MySQL kurulumu i\u00e7in son kontrol<\/a><\/li>\n<li><a href=\"#sik-sorulan-sorular\">S\u0131k Sorulan Sorular<\/a><\/li>\n<\/ol>\n<\/div>\n<h2 id=\"vpste-mysql-kurmadan-once-bilmeniz-gerekenler\">VPS&#8217;te MySQL kurmadan \u00f6nce bilmeniz gerekenler<\/h2>\n<p>Bir VPS \u00fczerinde MySQL kurmak birka\u00e7 dakikal\u0131k i\u015ftir. G\u00fcvenli, bak\u0131m\u0131 yap\u0131labilir ve d\u0131\u015far\u0131ya gereksiz yere a\u00e7\u0131k olmayan bir kurulum ise biraz daha fazla dikkat ister. Benim i\u00e7in VPS MySQL kurulumu, <code>apt install<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131p servisin ye\u015file d\u00f6nmesini g\u00f6rmekle bitmiyor; veritaban\u0131na kimlerin eri\u015fece\u011fi, hangi adreste dinleyece\u011fi, nas\u0131l yedeklenece\u011fi ve disk doldu\u011funda ne olaca\u011f\u0131 da ayn\u0131 plan\u0131n par\u00e7as\u0131.<\/p>\n<p>\u00d6nce i\u015fletim sistemiyle veritaban\u0131 paketini netle\u015ftirin. Ubuntu 22.04 ve 24.04 \u00fczerinde resmi depolarda MySQL 8.0 paketleriyle kar\u015f\u0131la\u015fman\u0131z yayg\u0131n. Debian 12 ise varsay\u0131lan olarak \u00e7o\u011fu kurulumda MariaDB 10.11 sa\u011flar. MariaDB, MySQL ile ayn\u0131 aileden gelse de birebir ayn\u0131 \u00fcr\u00fcn de\u011fildir; yap\u0131land\u0131rma se\u00e7enekleri, s\u00fcr\u00fcm davran\u0131\u015flar\u0131 ve baz\u0131 SQL \u00f6zellikleri farkl\u0131la\u015fabilir.<\/p>\n<p>Uygulaman\u0131z \u00f6zellikle MySQL 8.0 veya 8.4 istiyorsa i\u015fletim sistemi deposunu, MySQL&#8217;in resmi deposunu ya da sa\u011flay\u0131c\u0131n\u0131z\u0131n haz\u0131r imaj\u0131n\u0131 se\u00e7meden \u00f6nce s\u00fcr\u00fcm uyumlulu\u011funu kontrol edin. Rastgele bir \u00fc\u00e7\u00fcnc\u00fc taraf beti\u011fini root olarak \u00e7al\u0131\u015ft\u0131rmak kurulumu h\u0131zland\u0131r\u0131yor gibi g\u00f6r\u00fcnebilir. Geride ne b\u0131rakt\u0131\u011f\u0131n\u0131 anlamak daha zordur.<\/p>\n<h3>Kurulumdan \u00f6nce k\u0131sa kontrol listesi<\/h3>\n<ul>\n<li>VPS&#8217;e SSH ile ayr\u0131 bir y\u00f6netici hesab\u0131ndan ba\u011flanabiliyor musunuz?<\/li>\n<li>\u0130\u015fletim sistemi g\u00fcncel mi ve saat do\u011fru mu?<\/li>\n<li>Veritaban\u0131, binary log ve yedekler i\u00e7in yeterli disk alan\u0131 var m\u0131?<\/li>\n<li>Uygulama ile MySQL ayn\u0131 VPS&#8217;te mi \u00e7al\u0131\u015facak, yoksa uzak bir sunucudan m\u0131 ba\u011flanacak?<\/li>\n<li>Sa\u011flay\u0131c\u0131n\u0131n snapshot \u00f6zelli\u011fi var m\u0131? Snapshot&#8217;\u0131n tek ba\u015f\u0131na yedek olmad\u0131\u011f\u0131n\u0131 hesaba katt\u0131n\u0131z m\u0131?<\/li>\n<\/ul>\n<p>Yeni bir makineyi \u00f6nce lab\u0131mdaki Proxmox sanal makinesinde kurar\u0131m. Dell OptiPlex 7050 \u00fczerindeki bu VM, yanl\u0131\u015f bir <code>bind-address<\/code> veya bozuk bir systemd override y\u00fcz\u00fcnden \u00e7\u00f6kerse m\u00fc\u015fteri sitesi etkilenmez. \u00dcretim sunucusunda deneme yapman\u0131n romantik bir taraf\u0131 yok.<\/p>\n<h2 id=\"ubuntu-ve-debian-uzerinde-mysql-kurulumu\">Ubuntu ve Debian \u00fczerinde MySQL kurulumu<\/h2>\n<p>A\u015fa\u011f\u0131daki ad\u0131mlar Ubuntu 22.04 ve 24.04 \u00fczerinde MySQL 8.0 paket d\u00fczeni i\u00e7in haz\u0131rlanm\u0131\u015ft\u0131r. Debian kullan\u0131yorsan\u0131z \u00f6nce hangi paketin kurulaca\u011f\u0131n\u0131 kontrol edin:<\/p>\n<pre><code>cat \/etc\/os-release\napt-cache policy mysql-server mariadb-server<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131daki <code>Candidate<\/code> sat\u0131r\u0131 depoda hangi s\u00fcr\u00fcm\u00fcn se\u00e7ilece\u011fini g\u00f6sterir. Ubuntu taraf\u0131nda MySQL paketini kurmak i\u00e7in:<\/p>\n<pre><code>sudo apt update\nsudo apt full-upgrade -y\nsudo apt install -y mysql-server\nsudo systemctl enable --now mysql\nsudo systemctl status mysql --no-pager<\/code><\/pre>\n<p><code>enable --now<\/code> iki i\u015fi birden yapar: servisi hemen ba\u015flat\u0131r ve VPS yeniden ba\u015flad\u0131\u011f\u0131nda otomatik a\u00e7\u0131lmas\u0131n\u0131 sa\u011flar. <code>status<\/code> \u00e7\u0131kt\u0131s\u0131nda <code>active (running)<\/code> g\u00f6rmeniz iyi bir i\u015farettir; g\u00fcvenli yap\u0131land\u0131rman\u0131n tamamland\u0131\u011f\u0131 anlam\u0131na gelmez.<\/p>\n<p>S\u00fcr\u00fcm\u00fc ve ger\u00e7ekten hangi sunucunun \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kontrol edin:<\/p>\n<pre><code>mysql --version\nsudo mysql -e \"SELECT VERSION(), USER(), @@hostname;\"<\/code><\/pre>\n<p><code>@@hostname<\/code> de\u011ferini \u00f6zellikle not al\u0131r\u0131m. Birka\u00e7 VPS ile \u00e7al\u0131\u015f\u0131rken yanl\u0131\u015f sunucuda i\u015flem yapma ihtimali k\u00fc\u00e7\u00fcmsenecek bir \u015fey de\u011fil. Bir gece staging sand\u0131\u011f\u0131m sunucuda eski bir log dizinini silmeye haz\u0131rlan\u0131rken shell otomatik tamamlamada production hostname&#8217;ini g\u00f6rd\u00fcm. Elim <code>Enter<\/code>&#8216;a gitmi\u015fti. O g\u00fcnden beri sunucu ad\u0131n\u0131 komuttan hemen \u00f6nce tekrar kontrol ederim; production prompt&#8217;lerinin k\u0131rm\u0131z\u0131 olmas\u0131 da bu y\u00fczden.<\/p>\n<h3>Servis \u00e7al\u0131\u015fm\u0131yorsa loglara bak\u0131n<\/h3>\n<p>Servisi tekrar tekrar ba\u015flatmadan \u00f6nce neden a\u00e7\u0131lmad\u0131\u011f\u0131n\u0131 okuyun. Log okumadan reboot etmek, motor \u0131\u015f\u0131\u011f\u0131 yand\u0131\u011f\u0131nda ak\u00fcy\u00fc s\u00f6kmeye benziyor.<\/p>\n<pre><code>sudo journalctl -u mysql -b --no-pager -n 100\nsudo ss -lntp | grep 3306\nsudo systemctl is-enabled mysql<\/code><\/pre>\n<p><code>journalctl<\/code> son a\u00e7\u0131l\u0131\u015ftan itibaren MySQL g\u00fcnl\u00fcklerini getirir. <code>ss<\/code> ise 3306\/TCP portunda hangi adresin dinlendi\u011fini g\u00f6sterir. Hen\u00fcz uzak eri\u015fimi a\u00e7mad\u0131ysan\u0131z yaln\u0131zca <code>127.0.0.1:3306<\/code> veya IPv6 i\u00e7in <code>::1:3306<\/code> g\u00f6rmeniz beklenir.<\/p>\n<h2 id=\"ilk-guvenlik-adimlari\">\u0130lk g\u00fcvenlik ad\u0131mlar\u0131<\/h2>\n<p>Kurulumdan hemen sonra <code>mysql_secure_installation<\/code> komutunu \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code>sudo mysql_secure_installation<\/code><\/pre>\n<p>Komut, s\u00fcr\u00fcme g\u00f6re root do\u011frulama eklentisi, anonim kullan\u0131c\u0131lar, test veritaban\u0131 ve uzaktan root eri\u015fimi hakk\u0131nda sorular sorar. Anonim kullan\u0131c\u0131lar\u0131 kald\u0131rmak, test veritaban\u0131n\u0131 silmek ve root&#8217;un uzaktan ba\u011flanmas\u0131n\u0131 reddetmek \u00e7o\u011fu kurulumda do\u011fru tercihtir.<\/p>\n<p>Ubuntu paketlerinde root hesab\u0131 \u00e7o\u011fu zaman <code>auth_socket<\/code> veya <code>unix_socket<\/code> \u00fczerinden yaln\u0131zca i\u015fletim sistemi root yetkisiyle \u00e7al\u0131\u015f\u0131r. Bu durumda parolayla <code>mysql -u root -p<\/code> denemek yerine:<\/p>\n<pre><code>sudo mysql<\/code><\/pre>\n<p>ile ba\u011flan\u0131rs\u0131n\u0131z. Bu davran\u0131\u015f bir problem de\u011fil, sald\u0131r\u0131 y\u00fczeyini azaltan bilin\u00e7li bir tercihtir. Uygulamaya root parolas\u0131 vermeyin. Uygulama i\u00e7in ayr\u0131 bir hesap a\u00e7\u0131n.<\/p>\n<h3>Uygulama veritaban\u0131 ve kullan\u0131c\u0131 olu\u015fturma<\/h3>\n<p>\u00d6nce g\u00fc\u00e7l\u00fc ve tahmin edilmesi zor bir parola \u00fcretin. Parolay\u0131 komut sat\u0131r\u0131na do\u011frudan yazmak shell ge\u00e7mi\u015finde kalabilece\u011fi i\u00e7in parola istemek veya g\u00fcvenli bir parola y\u00f6neticisi kullanmak daha iyidir. MySQL istemcisinde a\u015fa\u011f\u0131daki SQL veritaban\u0131 ve kullan\u0131c\u0131 olu\u015fturur:<\/p>\n<pre><code>sudo mysql<\/code><\/pre>\n<pre><code>CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;\nCREATE USER 'shop_app'@'localhost' IDENTIFIED BY 'uzun-ve-rastgele-bir-parola';\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP\nON shop.* TO 'shop_app'@'localhost';\nFLUSH PRIVILEGES;\nEXIT;<\/code><\/pre>\n<p><code>utf8mb4<\/code> g\u00fcncel uygulamalar i\u00e7in iyi bir ba\u015flang\u0131\u00e7t\u0131r; d\u00f6rt baytl\u0131k Unicode karakterlerini destekler. <code>utf8mb4_0900_ai_ci<\/code> MySQL 8.0 i\u00e7indir. MariaDB kullan\u0131yorsan\u0131z bu collation ad\u0131n\u0131n desteklenip desteklenmedi\u011fini ayr\u0131ca kontrol edin.<\/p>\n<p><code>DROP<\/code> yetkisini uygulaman\u0131n normal \u00e7al\u0131\u015fma hesab\u0131na vermek istemezseniz migration i\u015flemleri i\u00e7in ayr\u0131 bir kullan\u0131c\u0131 olu\u015fturun. Her \u015feyi tek hesaba vermek ilk g\u00fcn kolay g\u00f6r\u00fcn\u00fcr, \u00fc\u00e7\u00fcnc\u00fc ayda kimin ne yapabildi\u011fini izlemeyi zorla\u015ft\u0131r\u0131r.<\/p>\n<p>Yetkileri kontrol etmek i\u00e7in:<\/p>\n<pre><code>sudo mysql -e \"SHOW GRANTS FOR 'shop_app'@'localhost';\"<\/code><\/pre>\n<p>Uygulama ba\u011flant\u0131s\u0131n\u0131 da test edin. Parolay\u0131 history&#8217;ye yazmamak i\u00e7in istemcinin parola sormas\u0131n\u0131 sa\u011flay\u0131n:<\/p>\n<pre><code>mysql -u shop_app -p -h 127.0.0.1 -D shop -e \"SELECT DATABASE(), CURRENT_USER();\"<\/code><\/pre>\n<p>Burada <code>localhost<\/code> ile <code>127.0.0.1<\/code> aras\u0131nda k\u00fc\u00e7\u00fck ama \u00f6nemli bir fark vard\u0131r. MySQL istemcisi <code>localhost<\/code> i\u00e7in Unix socket kullanabilir; <code>127.0.0.1<\/code> TCP ba\u011flant\u0131s\u0131n\u0131 zorlar. Uygulaman\u0131z\u0131n kulland\u0131\u011f\u0131 y\u00f6ntemle test edin.<\/p>\n<h2 id=\"mysqli-internete-acmali-misiniz\">MySQL&#8217;i internete a\u00e7mal\u0131 m\u0131s\u0131n\u0131z?<\/h2>\n<p>\u00c7o\u011fu VPS senaryosunda cevap hay\u0131rd\u0131r. Web uygulamas\u0131 ve MySQL ayn\u0131 makinedeyse MySQL&#8217;i yaln\u0131zca loopback adresinde dinletin. Ubuntu paketlerinde ayar dosyas\u0131n\u0131 \u015fu konumda bulabilirsiniz:<\/p>\n<pre><code>sudo vim \/etc\/mysql\/mysql.conf.d\/mysqld.cnf<\/code><\/pre>\n<p><code>vim<\/code> yerine sunucuda bulunan ba\u015fka bir edit\u00f6r\u00fc kullanabilirsiniz; ben sade <code>.vimrc<\/code> d\u00fczenimle devam ediyorum. \u0130lgili b\u00f6l\u00fcmde \u015fu sat\u0131r\u0131 kontrol edin:<\/p>\n<pre><code>[mysqld]\nbind-address = 127.0.0.1<\/code><\/pre>\n<p>Baz\u0131 s\u00fcr\u00fcmlerde sat\u0131r\u0131n ba\u015f\u0131nda <code>#<\/code> bulunabilir. De\u011fi\u015fiklikten sonra \u00f6nce yap\u0131land\u0131rmay\u0131 test edip servisi yeniden ba\u015flat\u0131n:<\/p>\n<pre><code>sudo mysqld --validate-config\nsudo systemctl restart mysql\nsudo ss -lntp | grep 3306<\/code><\/pre>\n<p><code>mysqld --validate-config<\/code> sessiz d\u00f6n\u00fcyorsa yap\u0131land\u0131rma s\u00f6zdizimi a\u00e7\u0131s\u0131ndan sorun g\u00f6rmemi\u015ftir. Yine de restart sonras\u0131nda <code>systemctl status mysql<\/code> ve journal \u00e7\u0131kt\u0131s\u0131n\u0131 kontrol ederim. Bir sat\u0131rdaki yaz\u0131m hatas\u0131 veritaban\u0131n\u0131 a\u00e7\u0131lmayacak hale getirebilir.<\/p>\n<p>Ba\u015fka bir VPS&#8217;teki uygulaman\u0131n ba\u011flanmas\u0131 gerekiyorsa 3306 portunu herkese a\u00e7may\u0131n. \u00d6nce kaynak IP&#8217;yi belirleyin, sonra firewall&#8217;da yaln\u0131zca o IP&#8217;ye izin verin:<\/p>\n<pre><code>sudo ufw allow from 203.0.113.25 to any port 3306 proto tcp\nsudo ufw status numbered<\/code><\/pre>\n<p>Uygulama IP&#8217;si de\u011fi\u015febilen bir bulut ortam\u0131ndaysa sabit \u00f6zel a\u011f, VPN veya SSH t\u00fcneli daha sa\u011fl\u0131kl\u0131 olabilir. UFW kullanm\u0131yorsan\u0131z nftables ya da sa\u011flay\u0131c\u0131n\u0131n g\u00fcvenlik grubunu ayn\u0131 kural mant\u0131\u011f\u0131yla yap\u0131land\u0131r\u0131n. <code>0.0.0.0\/0<\/code> kaynakl\u0131 3306 kural\u0131n\u0131 &#8220;ge\u00e7ici&#8221; diye b\u0131rakmak, ge\u00e7icili\u011fini en h\u0131zl\u0131 kaybeden kurallardan biridir.<\/p>\n<h3>Uzak kullan\u0131c\u0131 hesab\u0131 gerekiyorsa<\/h3>\n<p>Uzak ba\u011flant\u0131 \u015fartsa kullan\u0131c\u0131y\u0131 <code>'shop_app'@'%'<\/code> olarak yaratmak yerine izin verilen kaynak adresini yaz\u0131n:<\/p>\n<pre><code>CREATE USER 'shop_app'@'203.0.113.25' IDENTIFIED BY 'uzun-ve-rastgele-bir-parola';\nGRANT SELECT, INSERT, UPDATE, DELETE ON shop.*\nTO 'shop_app'@'203.0.113.25';<\/code><\/pre>\n<p>MySQL kullan\u0131c\u0131 hesab\u0131nda host b\u00f6l\u00fcm\u00fc de kimli\u011fin par\u00e7as\u0131d\u0131r. <code>'shop_app'@'localhost'<\/code> ile <code>'shop_app'@'203.0.113.25'<\/code> iki ayr\u0131 hesapt\u0131r. Bu ayr\u0131nt\u0131y\u0131 atlay\u0131p &#8220;kullan\u0131c\u0131 var ama eri\u015femiyor&#8221; \u015fik\u00e2yetiyle epey vakit kaybettim; <code>SELECT user, host FROM mysql.user;<\/code> \u00e7\u0131kt\u0131s\u0131 ger\u00e7e\u011fi genellikle h\u0131zl\u0131ca g\u00f6sterir.<\/p>\n<h2 id=\"root-parolasi-kimlik-dogrulama-ve-tls\">Root parolas\u0131, kimlik do\u011frulama ve TLS<\/h2>\n<p>MySQL 8.0 yeni kullan\u0131c\u0131lar i\u00e7in varsay\u0131lan olarak <code>caching_sha2_password<\/code> eklentisini kullan\u0131r. Eski PHP s\u00fcr\u00fcmleri veya eski istemciler bunu desteklemeyebilir. S\u0131rf eski uygulama ba\u011flans\u0131n diye b\u00fct\u00fcn sunucuyu eski bir kimlik do\u011frulama y\u00f6ntemine \u00e7evirmek yerine \u00f6nce uygulama s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc g\u00fcncelleyin.<\/p>\n<p>Mevcut kullan\u0131c\u0131lar\u0131n eklentisini \u015f\u00f6yle g\u00f6rebilirsiniz:<\/p>\n<pre><code>sudo mysql -e \"SELECT user, host, plugin FROM mysql.user;\"<\/code><\/pre>\n<p>Uygulama ile MySQL ayr\u0131 sunuculardaysa ba\u011flant\u0131y\u0131 \u015fifrelemek gerekir. MySQL sunucusunun TLS durumunu kontrol edin:<\/p>\n<pre><code>sudo mysql -e \"SHOW VARIABLES LIKE 'require_secure_transport';\"\nsudo mysql -e \"SHOW VARIABLES LIKE 'have_ssl';\"<\/code><\/pre>\n<p>Sertifika \u00fcretimi, dosya sahiplikleri ve istemci yap\u0131land\u0131rmas\u0131 kulland\u0131\u011f\u0131n\u0131z da\u011f\u0131t\u0131m ile MySQL s\u00fcr\u00fcm\u00fcne g\u00f6re de\u011fi\u015fir. \u00dcretimde self-signed sertifikay\u0131 istemciye do\u011frulatmadan kullanmak, trafi\u011fi \u015fifreli g\u00f6sterip sunucunun ger\u00e7ekten do\u011frulanmas\u0131n\u0131 ihmal edebilir. Uzak eri\u015fim gerekiyorsa CA sertifikas\u0131n\u0131 uygulama taraf\u0131nda do\u011frulay\u0131n ve kullan\u0131c\u0131y\u0131 <code>REQUIRE SSL<\/code> ile s\u0131n\u0131rlay\u0131n:<\/p>\n<pre><code>ALTER USER 'shop_app'@'203.0.113.25' REQUIRE SSL;<\/code><\/pre>\n<p>Bu kullan\u0131c\u0131 daha \u00f6nce olu\u015fturulmad\u0131ysa komut do\u011fal olarak hata verir; <code>ALTER USER<\/code> mevcut hesab\u0131 de\u011fi\u015ftirir, yeni hesap olu\u015fturmaz. \u00dcretimde kopyalamadan \u00f6nce kullan\u0131c\u0131 ve host de\u011ferlerini kendi kurulumunuzla kar\u015f\u0131la\u015ft\u0131r\u0131n.<\/p>\n<h2 id=\"kaynak-kullanimi-ve-temel-mysql-yapilandirmasi\">Kaynak kullan\u0131m\u0131 ve temel MySQL yap\u0131land\u0131rmas\u0131<\/h2>\n<p>VPS MySQL kurulumunda s\u0131k g\u00f6rd\u00fc\u011f\u00fcm hata, fiziksel RAM&#8217;in tamam\u0131n\u0131 MySQL&#8217;e b\u0131rakmak. Ayn\u0131 sunucuda nginx, PHP-FPM ve Redis varsa <code>innodb_buffer_pool_size<\/code> de\u011ferini k\u00f6rlemesine y\u00fckseltmeyin. InnoDB i\u00e7in ayr\u0131lan bellek, uygulaman\u0131n ve i\u015fletim sisteminin pay\u0131 \u00e7\u0131kar\u0131ld\u0131ktan sonra belirlenmeli.<\/p>\n<p>\u00d6rne\u011fin 4 GB RAM&#8217;li, yaln\u0131zca k\u00fc\u00e7\u00fck bir web uygulamas\u0131 \u00e7al\u0131\u015ft\u0131ran VPS&#8217;te ba\u015flang\u0131\u00e7 de\u011ferini 1 GB civar\u0131nda tutup g\u00f6zlemlemek, 2 GB&#8217;\u0131 do\u011frudan buffer pool&#8217;a vermekten daha g\u00fcvenlidir. Kesin de\u011fer i\u015f y\u00fck\u00fcne, ba\u011flant\u0131 say\u0131s\u0131na ve sorgulara ba\u011fl\u0131d\u0131r. Ben \u00f6nce metrik toplar, sonra de\u011fi\u015ftiririm.<\/p>\n<p>Ayar dosyas\u0131n\u0131n da\u011f\u0131t\u0131mda hangi dosyalardan olu\u015ftu\u011funu g\u00f6r\u00fcn:<\/p>\n<pre><code>sudo mysqld --verbose --help 2&gt;\/dev\/null | grep -A 1 \"Default options\"\nsudo mysql -e \"SHOW VARIABLES LIKE 'innodb_buffer_pool_size';\"\nsudo mysql -e \"SHOW VARIABLES LIKE 'max_connections';\"<\/code><\/pre>\n<p>De\u011fi\u015fiklik yapmadan \u00f6nce dosyan\u0131n yede\u011fini al\u0131n:<\/p>\n<pre><code>sudo cp -a \/etc\/mysql\/mysql.conf.d\/mysqld.cnf \n  \/etc\/mysql\/mysql.conf.d\/mysqld.cnf.$(date +%F)<\/code><\/pre>\n<p>Ard\u0131ndan \u00f6rnek bir ayar\u0131 i\u015f y\u00fck\u00fcn\u00fcze g\u00f6re ekleyebilirsiniz:<\/p>\n<pre><code>[mysqld]\ninnodb_buffer_pool_size = 1G\nmax_connections = 100\nslow_query_log = ON\nslow_query_log_file = \/var\/log\/mysql\/mysql-slow.log\nlong_query_time = 1<\/code><\/pre>\n<p><code>max_connections<\/code> i\u00e7in y\u00fcksek bir say\u0131 yazmak kapasite yaratmaz; her ba\u011flant\u0131n\u0131n bellek maliyeti vard\u0131r. PHP-FPM process say\u0131s\u0131, uygulaman\u0131n connection pool ayar\u0131 ve ger\u00e7ek e\u015fzamanl\u0131 trafik bilinmeden bu de\u011feri art\u0131rmay\u0131n. Yava\u015f sorgu g\u00fcnl\u00fc\u011f\u00fc de kal\u0131c\u0131 olarak a\u00e7\u0131k b\u0131rak\u0131l\u0131rsa disk t\u00fcketebilir; logrotate ve izleme kural\u0131n\u0131 birlikte planlay\u0131n.<\/p>\n<p>De\u011fi\u015fiklikten sonra:<\/p>\n<pre><code>sudo mysqld --validate-config\nsudo systemctl restart mysql\nsudo systemctl --no-pager --full status mysql\nsudo journalctl -u mysql -b -n 50 --no-pager<\/code><\/pre>\n<p>Hata varsa eski yap\u0131land\u0131rma yede\u011fine d\u00f6nmekten \u00e7ekinmeyin. Bir ayar\u0131n daha performansl\u0131 olmas\u0131, servis a\u00e7\u0131lm\u0131yorsa teorik bir ba\u015far\u0131d\u0131r.<\/p>\n<h2 id=\"yedekleme-olmadan-kurulum-tamamlanmis-sayilmaz\">Yedekleme olmadan kurulum tamamlanm\u0131\u015f say\u0131lmaz<\/h2>\n<p>VPS snapshot&#8217;\u0131 kullan\u0131\u015fl\u0131d\u0131r ama tek ba\u015f\u0131na MySQL yede\u011fi de\u011fildir. Snapshot al\u0131n\u0131rken veritaban\u0131 yazma i\u015flemleri devam edebilir; ayr\u0131ca snapshot ayn\u0131 sa\u011flay\u0131c\u0131ya ve \u00e7o\u011fu zaman ayn\u0131 ar\u0131za alan\u0131na ba\u011fl\u0131d\u0131r. Uygulama verisi i\u00e7in d\u00fczenli mant\u0131ksal veya fiziksel yedek, farkl\u0131 bir depolama alan\u0131nda tutulmal\u0131d\u0131r.<\/p>\n<p>K\u00fc\u00e7\u00fck veritabanlar\u0131nda <code>mysqldump<\/code> ile ba\u015flayabilirsiniz:<\/p>\n<pre><code>sudo install -d -m 700 \/var\/backups\/mysql\nsudo mysqldump --single-transaction --routines --triggers \n  --databases shop &gt; \/var\/backups\/mysql\/shop-$(date +%F).sql<\/code><\/pre>\n<p><code>--single-transaction<\/code> InnoDB tablolar\u0131nda dump al\u0131n\u0131rken tablo kilitlerini azalt\u0131r. \u00c7ok b\u00fcy\u00fck veritabanlar\u0131nda dump s\u00fcresi ve disk kullan\u0131m\u0131 sorun olabilir; o noktada Percona XtraBackup veya MySQL Enterprise Backup gibi fiziksel yedekleme se\u00e7eneklerini ayr\u0131ca de\u011ferlendirmek gerekir.<\/p>\n<p>Dump dosyas\u0131n\u0131 VPS&#8217;te b\u0131rak\u0131p &#8220;yedek ald\u0131m&#8221; demeyin. Ben <code>rsync<\/code> ile ayr\u0131 bir yedek makinesine g\u00f6nderip <code>borgbackup<\/code> ile s\u00fcr\u00fcml\u00fc ve \u015fifreli saklamay\u0131 tercih ediyorum. Ayda bir geri d\u00f6n\u00fc\u015f provas\u0131 yapar\u0131m; test edilmemi\u015f yedek yaln\u0131zca iyi niyetli bir dosyad\u0131r.<\/p>\n<pre><code>mysql -u root -p shop &lt; \/path\/to\/shop-2026-08-30.sql<\/code><\/pre>\n<p>Geri y\u00fckleme komutunu canl\u0131 veritaban\u0131nda \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce ayr\u0131 bir test veritaban\u0131nda veya test VPS&#8217;inde deneyin. Karakter seti, kullan\u0131c\u0131 yetkileri, stored procedure&#8217;ler ve dosyan\u0131n ger\u00e7ekten g\u00fcncel olup olmad\u0131\u011f\u0131 kontrol edilmelidir.<\/p>\n<h2 id=\"kurulumdan-sonra-kontrol-edilmesi-gerekenler\">Kurulumdan sonra kontrol edilmesi gerekenler<\/h2>\n<p>MySQL kurulumu sonras\u0131nda \u015fu kontrolleri otomatik izlemeye almak mant\u0131kl\u0131d\u0131r:<\/p>\n<ul>\n<li>MySQL servisinin \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131<\/li>\n<li>Disk kullan\u0131m\u0131n\u0131n ve inode durumunun s\u0131n\u0131r\u0131<\/li>\n<li>Ba\u011flant\u0131 say\u0131s\u0131 ve reddedilen ba\u011flant\u0131lar<\/li>\n<li>InnoDB buffer pool kullan\u0131m\u0131<\/li>\n<li>Yava\u015f sorgu say\u0131s\u0131<\/li>\n<li>Son ba\u015far\u0131l\u0131 yedekleme zaman\u0131<\/li>\n<\/ul>\n<p>Evdeki Proxmox sistemimde Prometheus i\u00e7in <code>node_exporter<\/code> \u00e7al\u0131\u015ft\u0131r\u0131yorum; disk ve RAM alarmlar\u0131, MySQL&#8217;i do\u011frudan izlemekten \u00f6nce bile birka\u00e7 ciddi sorunu yakalad\u0131. MySQL metrikleri i\u00e7in uygun bir exporter ekleyebilirsiniz, fakat exporter hesab\u0131na yaln\u0131zca gereken global okuma yetkilerini verin. Monitoring hesab\u0131 da root olmamal\u0131.<\/p>\n<p>Disk kullan\u0131m\u0131n\u0131 h\u0131zl\u0131ca g\u00f6rmek i\u00e7in <code>ncdu<\/code> h\u00e2l\u00e2 en pratik ara\u00e7lardan biri:<\/p>\n<pre><code>sudo ncdu -x \/var\/lib\/mysql\nsudo du -sh \/var\/log\/mysql \/var\/lib\/mysql<\/code><\/pre>\n<p>\u00d6zellikle binary log kullan\u0131yorsan\u0131z dosyalar\u0131n retention ayar\u0131n\u0131 kontrol edin. Binary log&#8217;lar point-in-time recovery i\u00e7in de\u011ferlidir, fakat s\u0131n\u0131rs\u0131z tutulursa disk alarm\u0131n\u0131 sizden \u00f6nce \u00fcretim ortam\u0131 verir. Saklama s\u00fcresini yedekleme stratejinizle birlikte belirleyin.<\/p>\n<h3>G\u00fcvenlik kontrol komutlar\u0131<\/h3>\n<pre><code>sudo ss -lntp | grep 3306\nsudo mysql -e \"SELECT user, host FROM mysql.user;\"\nsudo mysql -e \"SHOW VARIABLES LIKE 'local_infile';\"\nsudo ufw status verbose<\/code><\/pre>\n<p><code>local_infile<\/code> uygulaman\u0131z gerektirmiyorsa kapat\u0131labilir; dosya y\u00fckleme davran\u0131\u015flar\u0131n\u0131 gereksiz yere geni\u015fletmenin anlam\u0131 yoktur. SSH portunu de\u011fi\u015ftirmek tek ba\u015f\u0131na g\u00fcvenlik de\u011fildir. As\u0131l savunma katmanlar\u0131 g\u00fc\u00e7l\u00fc kimlik do\u011frulama, g\u00fcncel paketler, firewall, en az yetki ve izlenen log&#8217;lard\u0131r. MySQL i\u00e7in de ayn\u0131 yakla\u015f\u0131m ge\u00e7erli.<\/p>\n<p>Sunucuyu i\u015fletim sistemi seviyesinde de s\u0131k\u0131la\u015ft\u0131rmak isterseniz <a href=\"https:\/\/www.vps.tc\/blog\/tr\/linux-sunucu-guvenligi-icin-zorunlu-10-temel-adim\/\">Linux Sunucu G\u00fcvenli\u011fi i\u00e7in Zorunlu 10 Temel Ad\u0131m<\/a> ba\u015fl\u0131kl\u0131 i\u00e7eri\u011fe bakabilirsiniz. Yeni bir VPS&#8217;in temel haz\u0131rl\u0131\u011f\u0131 i\u00e7in <a href=\"https:\/\/www.vps.tc\/blog\/tr\/yeni-vps-sunucuyu-30-dakikada-canliya-alma-rehberi\/\">Yeni VPS Sunucuyu 30 Dakikada Canliya Alma Rehberi<\/a> de kurulum s\u0131ras\u0131n\u0131 oturtman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h2 id=\"uygulamanin-mysqle-baglanmasi\">Uygulaman\u0131n MySQL&#8217;e ba\u011flanmas\u0131<\/h2>\n<p>Uygulama yap\u0131land\u0131rmas\u0131nda veritaban\u0131 host&#8217;u, portu, ad\u0131, kullan\u0131c\u0131 ad\u0131 ve parolas\u0131 bulunur. Parolay\u0131 Git deposuna, hata mesaj\u0131na veya herkesin okuyabildi\u011fi bir <code>.env<\/code> dosyas\u0131na koymay\u0131n. Dosya izinlerini de kontrol edin:<\/p>\n<pre><code>sudo chown root:www-data \/var\/www\/shop\/.env\nsudo chmod 640 \/var\/www\/shop\/.env\nsudo -u www-data test -r \/var\/www\/shop\/.env &amp;&amp; echo \"ok\"<\/code><\/pre>\n<p>Web sunucusu ile veritaban\u0131 ayn\u0131 VPS&#8217;teyse ba\u011flant\u0131y\u0131 loopback \u00fczerinde tutun. Ayr\u0131 sunucularda \u00f6zel a\u011f, firewall k\u0131s\u0131t\u0131 ve TLS&#8217;i beraber kullan\u0131n. Tek bir katmana g\u00fcvenmek yerine birka\u00e7 k\u00fc\u00e7\u00fck ve anla\u015f\u0131l\u0131r s\u0131n\u0131r kurmak daha az s\u00fcrpriz \u00fcretir.<\/p>\n<p>Uygulaman\u0131z WordPress, Joomla veya Drupal ise veritaban\u0131 ayarlar\u0131n\u0131n yan\u0131nda sorgu \u00f6nbelle\u011fi, PHP-FPM ve sayfa \u00f6nbelle\u011fini de ele al\u0131n. TTFB&#8217;yi milisaniye milisaniye tart\u0131\u015f\u0131p temel cache katman\u0131n\u0131 kurmamak, \u00f6l\u00e7\u00fcm yap\u0131yor gibi g\u00f6r\u00fcnmenin ba\u015fka bir bi\u00e7imi.<\/p>\n<h2 id=\"vps-mysql-kurulumu-icin-son-kontrol\">VPS MySQL kurulumu i\u00e7in son kontrol<\/h2>\n<p>Kurulum bitti\u011finde terminalde ye\u015fil bir servis g\u00f6rmek ho\u015f, fakat as\u0131l test birka\u00e7 g\u00fcn sonra yap\u0131l\u0131r. Uygulama ger\u00e7ek trafik alt\u0131nda hata veriyor mu, disk b\u00fcy\u00fcmesi izleniyor mu, yedekten geri d\u00f6nebiliyor musunuz, uzak port ger\u00e7ekten kapal\u0131 m\u0131? Bu sorular\u0131n cevab\u0131 yoksa yap\u0131land\u0131rma tamamlanm\u0131\u015f say\u0131lmaz.<\/p>\n<p>Benim minimum d\u00fczenim \u015fu: uygulama i\u00e7in ayr\u0131 bir MySQL kullan\u0131c\u0131s\u0131, loopback&#8217;te dinleyen 3306, sa\u011flay\u0131c\u0131 firewall&#8217;\u0131, d\u00fczenli ve farkl\u0131 yerde tutulan yedek, yedek geri d\u00f6n\u00fc\u015f testi ve servis loglar\u0131n\u0131 izleyen bir alarm. Daha b\u00fcy\u00fck sistemlerde replikasyon, point-in-time recovery, ayr\u0131 veritaban\u0131 sunucusu ve ba\u011flant\u0131 havuzu eklenir; temel disiplin de\u011fi\u015fmez.<\/p>\n<p>Kurulumdan sonra terminali kapatmadan \u00f6nce bir kez daha <code>SELECT @@hostname;<\/code> \u00e7\u0131kt\u0131s\u0131na bakar\u0131m. Ge\u00e7mi\u015fte Tab tu\u015fu beni yanl\u0131\u015f bir <code>rm<\/code> komutundan kurtard\u0131; o k\u00fc\u00e7\u00fck duraksama, uzun bir kesintiden ucuzdu. Sizin sunucunuzda bug\u00fcn hangi komut, \u00e7al\u0131\u015fmadan \u00f6nce iki saniyelik bir kontrol bekliyor?<\/p>\n<h2 id=\"sik-sorulan-sorular\">S\u0131k Sorulan Sorular<\/h2>\n<h3>VPS \u00fczerinde MySQL root parolas\u0131 nas\u0131l belirlenir?<\/h3>\n<p>Ubuntu paketlerinde root hesab\u0131 \u00e7o\u011fu zaman Unix socket kimlik do\u011frulamas\u0131yla gelir ve <code>sudo mysql<\/code> komutuyla a\u00e7\u0131l\u0131r. Uygulamalara root hesab\u0131n\u0131 vermek yerine ayr\u0131 kullan\u0131c\u0131 olu\u015fturun; ger\u00e7ekten parola tabanl\u0131 root eri\u015fimi gerekiyorsa eri\u015fim y\u00f6ntemini ve riskini bilerek de\u011fi\u015ftirin.<\/p>\n<h3>MySQL 3306 portu internete a\u00e7\u0131lmal\u0131 m\u0131?<\/h3>\n<p>Uygulama ve MySQL ayn\u0131 VPS&#8217;teyse a\u00e7\u0131lmamal\u0131d\u0131r; <code>bind-address = 127.0.0.1<\/code> kullan\u0131n. Uzak ba\u011flant\u0131 zorunluysa yaln\u0131zca belirli kaynak IP&#8217;lere firewall izni verin, kullan\u0131c\u0131y\u0131 host adresiyle s\u0131n\u0131rland\u0131r\u0131n ve TLS kullan\u0131n.<\/p>\n<h3>MySQL ile MariaDB aras\u0131nda hangisi tercih edilmeli?<\/h3>\n<p>Se\u00e7im, uygulaman\u0131n ve kulland\u0131\u011f\u0131n\u0131z eklentilerin destekledi\u011fi s\u00fcr\u00fcme g\u00f6re yap\u0131lmal\u0131d\u0131r. Debian&#8217;\u0131n varsay\u0131lan MariaDB paketini MySQL sanarak kurmak sonradan uyumluluk sorunu \u00e7\u0131karabilir; kuruluma ba\u015flamadan \u00f6nce <code>apt-cache policy<\/code> ve uygulama belgelerini kontrol edin.<\/p>\n<h3>MySQL VPS yede\u011fi nas\u0131l test edilir?<\/h3>\n<p>Dump veya fiziksel yede\u011fi ayr\u0131 bir test VPS&#8217;ine geri y\u00fckleyip uygulaman\u0131n ger\u00e7ekten ba\u011fland\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n. Sadece dosyan\u0131n olu\u015fmas\u0131 yeterli de\u011fildir; geri d\u00f6n\u00fc\u015f s\u00fcresini, eksik tablolar\u0131, kullan\u0131c\u0131 yetkilerini ve karakter setini de kontrol edin.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>VPS \u00fczerinde MySQL kurulumu yaparken servisi \u00e7al\u0131\u015ft\u0131rmakla yetinmeyin. Kullan\u0131c\u0131 yetkileri, firewall, uzak eri\u015fim, performans ve yedekleme ayarlar\u0131n\u0131 birlikte yap\u0131land\u0131r\u0131n.<\/p>\n","protected":false},"author":2,"featured_media":380,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[383],"tags":[1409,389,1405,395,1249,1407,114],"class_list":["post-382","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","tag-debian","tag-linux","tag-mysql","tag-sunucu-guvenligi","tag-ubuntu","tag-veritabani","tag-vps"],"lang":"tr","translations":{"tr":382,"en":383},"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/382","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/comments?post=382"}],"version-history":[{"count":1,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/382\/revisions"}],"predecessor-version":[{"id":384,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/382\/revisions\/384"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/media\/380"}],"wp:attachment":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/media?parent=382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/categories?post=382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/tags?post=382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}