Bir siteyi taşımak, yedeği geri yüklemek ya da test ortamını kopyalamak hep aynı iki işleme çıkar: veritabanını dosyaya dökmek ve geri yüklemek. VPS Linux Infrawire üzerinde bunların ikisi de web arayüzü olmadan birkaç komutla yapılır. Bu rehber tutarlı dökümleri, sıkıştırmayı, büyük dosyaları, karakter kodlamasını ve sunucular arasında doğrudan aktarımı kapsar.
📋 Ön koşullar
- Ubuntu 24.04 veya Debian 12 çalıştıran, root SSH erişimli bir Linux VPS (IP adresi ve root parolası müşteri alanınızda yer alır)
- Kurulu MySQL ya da MariaDB, en azından istemcisi (
apt install mariadb-client) - Dökülecek veritabanında
SELECT,SHOW VIEW,TRIGGER,LOCK TABLESveEVENTyetkilerine sahip bir veritabanı kullanıcısı - Yeterli boş disk alanı:
df -hile kontrol edin
1. mysqldump ile veritabanını dışa aktarma
InnoDB tabloları (varsayılan motor) için --single-transaction, tabloları kilitlemeden tutarlı bir anlık görüntü üretir; böylece siteniz döküm sırasında çalışmaya devam eder.
Bashmysqldump -u USER -p --single-transaction --quick DBNAME > DBNAME.sql
Yeni MariaDB sürümlerinde aynı araç mariadb-dump adıyla da bulunur ve seçenekleri aynıdır.
2. Rutinleri, tetikleyicileri ve olayları dahil etme
Tetikleyiciler varsayılan olarak dökülür, ancak saklı yordamlar, fonksiyonlar ve zamanlanmış olaylar açıkça istenmelidir. Karakter kümesini belirtmek, Türkçe karakterlerde ve emojilerde sorun yaşamanızı önler.
Bashmysqldump -u USER -p --single-transaction --routines --triggers --events \ --default-character-set=utf8mb4 DBNAME > DBNAME.sql
İşe yarar varyantlar:
Bash# Yalnızca yapı, satırlar olmadan mysqldump -u USER -p --no-data DBNAME > schema.sql # Birden çok veritabanı, CREATE DATABASE ifadeleriyle mysqldump -u USER -p --single-transaction --databases DB1 DB2 > two-dbs.sql # Sunucudaki tüm veritabanları mysqldump -u root -p --single-transaction --routines --events --all-databases > all.sql
3. Dökümü gzip ile sıkıştırma
SQL metni çok iyi sıkışır. Çıktıyı doğrudan gzip'e yönlendirin; sıkıştırılmamış dosya diske hiç yazılmaz.
Bashmysqldump -u USER -p --single-transaction --routines --events DBNAME | gzip > DBNAME_$(date +%F).sql.gz
Parolayı her seferinde yazmamak (ve ps çıktısında görünmesini önlemek) için ~/.my.cnf içine koyun:
INI[client] user=USER password=YOUR_PASSWORD
Bashchmod 600 ~/.my.cnf
4. Dökümü içe aktarma
Önce hedef veritabanını modern bir karakter kümesiyle oluşturun, ardından dosyayı yükleyin.
Bashmysql -u USER -p -e 'CREATE DATABASE IF NOT EXISTS DBNAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' mysql -u USER -p --default-character-set=utf8mb4 DBNAME < DBNAME.sql # Sıkıştırılmış dosyadan gunzip -c DBNAME.sql.gz | mysql -u USER -p --default-character-set=utf8mb4 DBNAME
Dikkat: döküm varsayılan olarak DROP TABLE IF EXISTS içerir; mevcut bir veritabanına aktarım, aynı adlı tabloların yerini alır. Önce hedefi yedekleyin.
5. Büyük dosyalarla çalışma
Birkaç gigabaytlık dökümlerde, SSH bağlantısı kopsa bile kesilmemesi için içe aktarmayı tmux içinde çalıştırın ve ilerlemeyi pv ile izleyin.
Bashapt install -y tmux pv tmux new -s import pv DBNAME.sql.gz | gunzip | mysql -u USER -p --max-allowed-packet=512M DBNAME
Ctrl+B ardından D ile oturumdan ayrılın, daha sonra tmux attach -t import ile geri dönün.
6. SSH ile doğrudan başka bir sunucuya aktarma
Ara dosya gerekmez: döküm şifreli bir SSH borusundan geçer ve varışta yüklenir. Kimlik bilgileri her iki tarafta ~/.my.cnf dosyasından (veya root için yerel soketten) okunur.
Bashmysqldump --single-transaction --routines --events DBNAME | gzip \ | ssh root@NEW_VPS_IP 'gunzip | mysql DBNAME'
DBNAME veritabanı hedef sunucuda önceden var olmalıdır.
✅ Sonucu doğrulama
Bashgzip -t DBNAME.sql.gz && echo 'archive OK' mysql -e 'SHOW TABLES;' DBNAME mysql -e 'SELECT COUNT(*) FROM TABLENAME;' DBNAME mysql -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name='DBNAME';"
Birkaç önemli tablonun satır sayısını kaynak ve hedef arasında karşılaştırın.
🔧 Sorun giderme
ERROR 1045 Access denied : kullanıcı veya parola yanlış ya da kullanıcının bu ana makineden bağlanma izni yok. Önce mysql -u USER -p ile deneyin.
ERROR 2006 MySQL server has gone away : bir satır veya sorgu max_allowed_packet değerini aşıyor. Sunucuda yapılandırmanın [mysqld] bölümünde artırıp servisi yeniden başlatın ya da istemciye --max-allowed-packet=512M verin.
İçe aktarımdan sonra bozuk karakterler : dosya yanlış karakter kümesiyle okunmuş. --default-character-set=utf8mb4 ile dışa aktarın ve aynı seçenekle içe aktarın.
ERROR 1227 veya DEFINER hataları : döküm, hedefte bulunmayan bir kullanıcıya başvuruyor. İçe aktarırken bu ifadeyi çıkarın:
Bashsed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' DBNAME.sql | mysql -u USER -p DBNAME
🎉 Veritabanlarınızı artık kolayca yedekleyebilir, geri yükleyebilir ve sunucular arasında taşıyabilirsiniz!