15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın
09.10.2024

MySQL Veritabanlarını Komut Satırı Kullanarak İçe ve Dışa Aktarma

Komut satırından MySQL veritabanı içe ve dışa aktarma işlemlerinde uzmanlaşmak, her veritabanı yöneticisi veya arka uç mühendisi için vazgeçilmez bir beceridir. `mysqldump` yardımcı programı, şemayı ve verileri tam olarak yeniden oluşturmak için gereken tüm DDL ve DML ifadelerini içeren taşınabilir bir `.sql` dosyasına veritabanını dışa aktarırken, `mysql` istemci komutu bunun tersini gerçekleştirir — bu dosyayı çalışan bir MySQL örneğine geri akıtır.

Bu kılavuz her pratik senaryoyu kapsar: tek veritabanı dışa aktarmaları, çok veritabanı dökümleri, yalnızca yapı yedeklemeleri, sıkıştırılmış aktarımlar, karakter seti yönetimi ve güvenli içe aktarma iş akışları — üretim ortamlarında sessiz veri bozulmasına veya başarısız geri yüklemelere neden olan uç durumlar dahil.

Ön Koşullar

Bu kılavuzdaki herhangi bir komutu çalıştırmadan önce aşağıdakileri doğrulayın:

  • MySQL Server (5.7, 8.0 veya 8.4) kurulu ve `mysqld` işlemi çalışıyor olmalıdır
  • `mysqldump` ve `mysql` ikili dosyaları sistem `PATH` yolunuzda bulunmalıdır (`which mysqldump` ile doğrulayın)
  • Dışa aktarma için en az `SELECT`, `LOCK TABLES`, `SHOW VIEW` ve `TRIGGER` ayrıcalıklarına; içe aktarma için `CREATE`, `INSERT`, `ALTER` ve `DROP` ayrıcalıklarına sahip bir MySQL hesabınız olmalıdır
  • Hedefte yeterli disk alanı bulunmalıdır — sıkıştırılmış bir dökümün içe aktarımda 5–10 kat genişleyebileceğini unutmayın
  • Sunucuya kabuk erişiminiz olmalıdır (yerel terminal, SSH veya yönetilen bir VPS Hosting ortamı)

mysqldump ile Veritabanlarını Dışa Aktarma

`mysqldump`, MySQL ile birlikte gelen standart mantıksal yedekleme aracıdır. Veritabanı nesnelerini insan tarafından okunabilir bir SQL betiğine dönüştürür. Percona XtraBackup gibi fiziksel yedekleme araçlarının aksine, `mysqldump` depolama motorundan bağımsızdır ve MySQL sürümleri ile MariaDB çatalları arasında çalışır.

1. Tek Bir Veritabanını Dışa Aktarma

“`bash

mysqldump -u [username] -p [database_name] > [filename].sql

“`

Parametre açıklaması:

  • `-u [username]` — Bağlantı için kullanılan MySQL hesabı
  • `-p` — Etkileşimli parola istemi başlatır (paylaşımlı sistemlerde `-p[password]` şeklinde parolayı satır içinde asla geçirmeyin; `ps aux` çıktısında görünür)
  • `[database_name]` — Dışa aktarılacak hedef şema
  • `> [filename].sql` — Standart çıktıyı çıktı dosyasına yönlendirir

Örnek:

“`bash

mysqldump -u root -p mydatabase > mydatabase_backup.sql

“`

Bu işlem, `mydatabase` şemasını sıfırdan yeniden oluşturmak için yeterli `CREATE TABLE`, `INSERT` ve `ALTER TABLE` ifadelerini içeren bir dosya üretir.

Kritik uç durum: Varsayılan olarak, `mysqldump` dökümün başında global bir okuma kilidi (`FLUSH TABLES WITH READ LOCK`) alır. Yoğun trafikli InnoDB sunucularında, yazmaları engellemeden tutarlı bir anlık görüntü almak için bunun yerine `–single-transaction` kullanın:

“`bash

mysqldump -u root -p –single-transaction mydatabase > mydatabase_backup.sql

“`

`–single-transaction` yalnızca InnoDB tablolarıyla güvenilir şekilde çalışır. Veritabanınız MyISAM tabloları içeriyorsa kilit kaçınılmazdır.

2. Birden Fazla Veritabanını Dışa Aktarma

“`bash

mysqldump -u [username] -p –databases db1 db2 > multiple_databases_backup.sql

“`

`–databases` bayrağı, `mysqldump` programına çıktıya `CREATE DATABASE` ve `USE` ifadelerini eklemesini söyler ve döküm dosyasını bağımsız hale getirir. Bu bayrak olmadan söz konusu ifadeler atlanır ve dökümün içe aktarma sırasında hedef veritabanının zaten seçili olduğunu varsayar.

Örnek:

“`bash

mysqldump -u root -p –databases db1 db2 > multiple_databases_backup.sql

“`

3. Tüm Veritabanlarını Dışa Aktarma

“`bash

mysqldump -u root -p –all-databases > all_databases_backup.sql

“`

Bu işlem, bağlanan kullanıcının erişebildiği `mysql`, `information_schema` ve `performance_schema` sistem veritabanları dahil her şemayı dışa aktarır. Sistem veritabanlarını büyük MySQL sürüm sınırları arasında içe aktarmaktan kaçının — ayrıcalık tablosu şeması MySQL 5.7 ile 8.0 arasında önemli ölçüde değişti ve eski `mysql` şemasını yeni bir 8.0 örneğine aktarmak kimlik doğrulamayı bozar.

Sistem şemalarını hariç tutmak için:

“`bash

mysqldump -u root -p –all-databases

–ignore-table=mysql.user

–ignore-table=mysql.db

> all_user_databases_backup.sql

“`

4. Yalnızca Tablo Yapısını Dışa Aktarma (Veri Olmadan)

“`bash

mysqldump -u root -p –no-data mydatabase > structure_only.sql

“`

Bu, şema sürüm kontrolü, kod incelemeleri veya boş bir hazırlık ortamı oluşturmak için son derece değerlidir. Çıktı yalnızca `CREATE TABLE`, `CREATE VIEW`, `CREATE PROCEDURE` ve benzeri DDL ifadelerini içerir — `INSERT` satırı bulunmaz.

5. Belirli Tabloları Dışa Aktarma

“`bash

mysqldump -u root -p mydatabase table1 table2 > tables_backup.sql

“`

Bu şekilde belirli tabloları dışa aktarırken, `mysqldump` programının `CREATE DATABASE` veya `USE` ifadelerini dahil etmediğini unutmayın. İçe aktarmadan önce hedef veritabanının mevcut olduğundan emin olmanız gerekir.

6. Saklı Yordamlar, Tetikleyiciler ve Olaylarla Dışa Aktarma

Varsayılan olarak, `mysqldump` tetikleyicileri dahil eder ancak saklı yordamları, fonksiyonları ve zamanlanmış olayları atlar. Eksiksiz bir uygulama yedeklemesi için:

“`bash

mysqldump -u root -p

–routines

–triggers

–events

–single-transaction

mydatabase > full_backup.sql

“`

`–routines` seçeneğini unutmak, bozuk uygulama geri yüklemelerinin en yaygın nedenlerinden biridir — şema ve veriler mevcut olsa da iş mantığı eksik kalır.

7. Sıkıştırılmış Dışa Aktarma

Dosya boyutunu %60–80 oranında azaltmak için çıktıyı doğrudan `gzip` üzerinden aktarın:

“`bash

mysqldump -u root -p mydatabase | gzip > mydatabase_backup.sql.gz

“`

Büyük veritabanlarında maksimum sıkıştırma için (CPU süresi pahasına):

“`bash

mysqldump -u root -p mydatabase | gzip -9 > mydatabase_backup.sql.gz

“`

mysql İstemcisi ile Veritabanlarını İçe Aktarma

`mysql` komut satırı istemcisi, stdin yönlendirmesi aracılığıyla bir SQL dosyasını kabul eder ve her ifadeyi hedef sunucuya karşı sırayla çalıştırır.

1. Mevcut Bir Veritabanına İçe Aktarma

“`bash

mysql -u [username] -p [database_name] < [filename].sql

“`

Örnek:

“`bash

mysql -u root -p mydatabase < mydatabase_backup.sql

“`

Önemli: `.sql` dosyası `–databases` veya `–all-databases` ile dışa aktarıldıysa, zaten `CREATE DATABASE` ve `USE` yönergeleri içerir. Bu durumda komut satırında bir veritabanı adı belirtmeyin — bunu yapmak çakışmaya neden olur:

“`bash

mysql -u root -p < all_databases_backup.sql

“`

2. Yeni Bir Veritabanına İçe Aktarma

İçe aktarma yapmadan önce hedef veritabanının mevcut olması gerekir. MySQL, yalın bir tablo dökümünden otomatik olarak veritabanı oluşturmaz.

Adım 1 — Veritabanını oluşturun:

“`bash

mysql -u root -p -e "CREATE DATABASE newdatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

“`

Adım 2 — Döküm dosyasını içe aktarın:

“`bash

mysql -u root -p newdatabase < mydatabase_backup.sql

“`

Veritabanı oluşturma sırasında karakter setini ve harmanlamayı her zaman açıkça belirtin. Sunucu varsayılanlarına güvenmek, özellikle farklı `character_set_server` yapılandırmalarına sahip sunucular arasında geçiş yaparken sık karşılaşılan bir kodlama uyumsuzluğu kaynağıdır.

3. Sıkıştırılmış Bir Döküm Dosyasını İçe Aktarma

“`bash

gunzip < mydatabase_backup.sql.gz | mysql -u root -p mydatabase

“`

Veya `zcat` kullanarak (çoğu Linux dağıtımında eşdeğer):

“`bash

zcat mydatabase_backup.sql.gz | mysql -u root -p mydatabase

“`

4. İlerleme İzleme ile İçe Aktarma

Büyük döküm dosyaları için standart `mysql` istemcisi herhangi bir geri bildirim vermez. Gerçek zamanlı bir ilerleme çubuğu görüntülemek için `pv` (pipe viewer) kullanın:

“`bash

pv mydatabase_backup.sql | mysql -u root -p mydatabase

“`

`pv` programını `apt install pv` veya `yum install pv` ile yükleyin. Çok gigabaytlık üretim veritabanlarını yöneten bir Dedicated Server üzerinde bu görünürlük operasyonel açıdan kritik öneme sahiptir.

mysqldump ve Alternatif Yedekleme Yöntemleri

ÖzellikmysqldumpmysqlpumpMySQL Shell (util.dumpInstance)Percona XtraBackup
Yedekleme türüMantıksal (SQL)Mantıksal (SQL)Mantıksal (JSON/SQL)Fiziksel (ikili)
ParalellikTek iş parçacıklıÇok iş parçacıklıÇok iş parçacıklıÇok iş parçacıklı
InnoDB sıcak yedekleme`–single-transaction` ile`–single-transaction` ileEvetEvet
Çıktı formatıDüz SQLDüz SQLParçalı dosyalarHam InnoDB dosyaları
Geri yükleme hızıYavaş (sıralı SQL)OrtaHızlıÇok hızlı
Çapraz sürüm taşınabilirliğiMükemmelİyiİyiYalnızca aynı ana sürüm
MySQL’e dahilEvetEvet (5.7.8+)Ayrı kurulumÜçüncü taraf
En iyi kullanım durumuTaşınabilirlik, küçük-orta DB’lerParalel dökümBulut/büyük şemalarBüyük üretim DB’leri

Yönetilen bir cPanel’li VPS üzerinde birden fazla üretim veritabanı çalıştıran ortamlar için, `mysqldump` uyumluluğu ve basitliği nedeniyle en evrensel desteklenen seçenek olmaya devam etmektedir.

Gelişmiş Yapılandırma ve Uç Durumlar

Karakter Setlerini Doğru Şekilde Yönetme

Karakter seti uyumsuzlukları, bozuk içe aktarmaların orantısız derecede büyük bir bölümünden sorumludur. En güvenli yaklaşım, her aşamada açık olmaktır:

“`bash

mysqldump -u root -p

–default-character-set=utf8mb4

mydatabase > mydatabase_backup.sql

“`

“`bash

mysql -u root -p

–default-character-set=utf8mb4

mydatabase < mydatabase_backup.sql

“`

Not: MySQL’deki `utf8`, 4 baytlık Unicode karakterleri (emoji, belirli CJK ideografları) depolayamayan 3 baytlık bir alt kümedir. Yeni veritabanları için her zaman `utf8mb4` kullanın.

Büyük İçe Aktarmaları Hızlandırma

Varsayılan olarak MySQL, döküm dosyasındaki her `INSERT` ifadesinden sonra tam bir commit gerçekleştirir. Büyük veri setleri için bu son derece yavaştır. İçe aktarma oturumunuzun başına aşağıdakileri ekleyin:

“`bash

mysql -u root -p mydatabase <<EOF

SET foreign_key_checks = 0;

SET unique_checks = 0;

SET autocommit = 0;

SOURCE /path/to/mydatabase_backup.sql;

COMMIT;

SET foreign_key_checks = 1;

SET unique_checks = 1;

EOF

“`

Alternatif olarak, toplu eklemeleri gruplamak ve veri yüklendikten sonra dizin yeniden oluşturmayı ertelemek için `–extended-insert` (varsayılan olarak etkin) ve `–disable-keys` ile dışa aktarın.

Cron ile Yedeklemeleri Otomatikleştirme

`/etc/cron.d/mysql-backup` içinde üretim kalitesinde otomatik yedekleme girişi:

“`bash

0 2 * * * root mysqldump -u backup_user -p'StrongPass'

–single-transaction –routines –triggers –events

mydatabase | gzip > /backups/mydatabase_$(date +%F).sql.gz

“`

`root` yerine minimum gerekli ayrıcalıklara sahip özel bir MySQL kullanıcısı kullanın. Şu şekilde oluşturun:

“`sql

CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'StrongPass';

GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER, EVENT ON *.* TO 'backup_user'@'localhost';

FLUSH PRIVILEGES;

“`

.my.cnf ile Kimlik Bilgilerini Güvence Altına Alma

Parolaları komut satırında geçirmek, bunları kabuk geçmişinde ve işlem listelerinde açığa çıkarır. Kimlik bilgilerini `~/.my.cnf` dosyasında saklayın:

“`ini

[client]

user=root

password=YourSecurePassword

“`

İzinleri hemen ayarlayın:

“`bash

chmod 600 ~/.my.cnf

“`

Bu yapılandırmayla birlikte, tüm `mysqldump` ve `mysql` komutları `-u` ve `-p` bayraklarına gerek kalmadan kimlik bilgilerini otomatik olarak alır.

Uzak Veritabanı Dışa Aktarma

Uzak bir MySQL sunucusundan veritabanı döküm almak için:

“`bash

mysqldump -h remote.server.com -P 3306 -u remoteuser -p remotedatabase > remote_backup.sql

“`

Uzak MySQL örneğinin IP adresinizden gelen bağlantılara izin verdiğinden ve güvenlik duvarında 3306 numaralı bağlantı noktasının açık olduğundan emin olun. Şifreli aktarımlar için SSH üzerinden tünel kurun:

“`bash

ssh -L 3307:127.0.0.1:3306 user@remote.server.com -N &

mysqldump -h 127.0.0.1 -P 3307 -u remoteuser -p remotedatabase > remote_backup.sql

“`

Pratik Karar Matrisi

SenaryoÖnerilen Komut
Tam yedekleme, yalnızca InnoDB, kesinti yok`mysqldump –single-transaction –routines –triggers –events`
Yeni sunucuya şema geçişi`mysqldump –no-data` + DB’yi yeniden oluştur + içe aktar
Tek veritabanını sunucular arasında taşıma`mysqldump dbgzipssh user@dest "gunzipmysql db"`
Tüm veritabanlarını yedekle, sistem şemalarını hariç tut`–all-databases` + sistem tabloları için `–ignore-table`
Büyük döküm dosyasının hızlı geri yüklenmesi`foreign_key_checks`, `unique_checks`, `autocommit` devre dışı bırak
Otomatik gecelik yedeklemeCron + özel yedekleme kullanıcısı + `.my.cnf` kimlik bilgileri
Yedekleme bütünlüğünü doğrulamaTest veritabanına aktar ve `SHOW TABLE STATUS` çalıştır

Temel Teknik Çıkarımlar

  • Dışa aktarma sırasında uygulama yazmalarını engellemekten kaçınmak için InnoDB veritabanlarında her zaman `–single-transaction` kullanın
  • `utf8mb4` seçeneğini her zaman açıkça belirtin — sunucu varsayılan karakter seti varsayımlarına asla güvenmeyin
  • Her tam uygulama yedeğine `–routines`, `–triggers` ve `–events` seçeneklerini dahil edin, aksi takdirde iş mantığını kaybetme riskiyle karşılaşırsınız
  • Sistem şema tablolarını (`mysql.*`) büyük MySQL sürüm sınırları arasında asla içe aktarmayın
  • Kimlik bilgilerini `~/.my.cnf` dosyasında `chmod 600` izniyle saklayın — parolaları asla satır içi argüman olarak geçirmeyin
  • 10 GB’ı aşan veritabanları için `mysqlpump` veya MySQL Shell’in paralel döküm yardımcı programlarını değerlendirin; çünkü `mysqldump` bir darboğaz haline gelecektir
  • Olağanüstü durum kurtarma için güvenmeden önce her yedeği yalıtılmış bir ortama test geri yüklemesi yaparak doğrulayın
  • Birden fazla istemci veritabanını barındırırken, geri yükleme işlemleri sırasında kiracılar arası erişimi önlemek için ayrı VPS Control Panel‘leri kullanarak ortamları izole edin
  • Veritabanı yedekleme stratejinizi, aktarım sırasında kimlik bilgisi ele geçirilmesini önlemek amacıyla MySQL’e bağlanan web’e yönelik her uygulama katmanında geçerli bir SSL Sertifikası ile eşleştirin

SSS

mysqldump ile mysqlpump arasındaki fark nedir?

`mysqldump` tek iş parçacıklıdır ve tek bir SQL dosyası üretir — güvenilir ve evrensel olarak uyumludur. MySQL 5.7.8’de tanıtılan `mysqlpump`, birden fazla veritabanı ve tabloyu eş zamanlı olarak paralel dışa aktarmayı destekler ve çok çekirdekli sunucularda döküm süresini önemli ölçüde azaltır. Ancak `mysqlpump`, karma motorlu veritabanlarının tutarlı yedeklemelerinde bilinen sorunlara sahiptir ve çapraz sürüm geçişleri için daha az uygundur.

MySQL 5.7 dökümünü MySQL 8.0’a aktarabilir miyim?

Evet, bazı uyarılarla birlikte. Kullanıcı verileri ve uygulama şemaları sorunsuz şekilde içe aktarılır. Ancak `mysql` sistem veritabanını doğrudan asla içe aktarmayın — kimlik doğrulama eklentisi 8.0’da `mysql_native_password`’dan `caching_sha2_password`’a değişti ve eski ayrıcalık tablolarını içe aktarmak kimlik doğrulamayı bozar. Kullanıcıları `CREATE USER` ve `GRANT` ifadelerini kullanarak manuel olarak yeniden oluşturun.

İçe aktarma işlemim yabancı anahtar kısıtlamaları nedeniyle “ERROR 1005: Can’t create table” hatasıyla neden başarısız oluyor?

Bu durum, tablolar yabancı anahtar bağımlılıklarını ihlal eden bir sırayla içe aktarıldığında meydana gelir. Çözüm, içe aktarma oturumunuzun başına `SET foreign_key_checks = 0;` eklemek ve tamamlandıktan sonra `SET foreign_key_checks = 1;` eklemektir. Alternatif olarak, döküm dosyasının kendisinde referans bütünlüğünü koruyan `–single-transaction` ile dışa aktarın.

CREATE TABLE ifadeleri olmadan yalnızca verileri nasıl dışa aktarabilirim?

`–no-create-info` bayrağını kullanın: `mysqldump -u root -p –no-create-info mydatabase > data_only.sql`. Bu, yapısını değiştirmeden mevcut bir şemaya veri yeniden yüklemeniz gerektiğinde kullanışlıdır.

MySQL dökümünü iki uzak sunucu arasında aktarmanın en güvenli yolu nedir?

Döküm dosyasını diske ara dosya yazmadan doğrudan SSH üzerinden aktarın: `mysqldump -u root -p sourcedb | ssh user@destination.server "mysql -u root -p targetdb"`. Bu, özellikle disk kotalarının kısıtlayıcı olduğu bir Paylaşımlı Web Hosting ortamında çalışırken, düz metin bir `.sql` dosyasını kopyalamaktan hem daha hızlı hem de daha güvenlidir.

15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın