Linux VPS'te MySQL/MariaDB veritabanını dışa ve içe aktarma

2 min
VPS/VDS Hosting

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 TABLES ve EVENT yetkilerine sahip bir veritabanı kullanıcısı
  • Yeterli boş disk alanı: df -h ile 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.

Bash
mysqldump -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.

Bash
mysqldump -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.

Bash
mysqldump -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
Bash
chmod 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.

Bash
mysql -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.

Bash
apt 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.

Bash
mysqldump --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

Bash
gzip -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:

Bash
sed -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!

En yeni teklifler, indirimler ve özel promosyonlardan haberdar olun.

Promosyonları gör

Çerez kullanıyoruz

Sitemizdeki deneyiminizi iyileştirmek için analiz çerezleri kullanıyoruz. Hiçbir veri üçüncü taraflara satılmaz. Daha fazlasını şurada öğrenin: gizlilik politikası.