Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Fungsi pencadangan MySQL PDO

Skrip cadangan itu konyol dan tidak ada yang boleh membuat versi lain darinya. Saya telah melihat skrip itu sebelumnya, serta upaya serupa, dan mereka memiliki banyak masalah:

  • Tidak membatasi nama tabel di back-ticks
  • Tidak menangani NULL
  • Tidak menangani set karakter
  • Tidak menangani data biner
  • Tidak mencadangkan VIEWs
  • Tidak mencadangkan PEMICU atau PROSEDUR TERSIMPAN atau FUNGSI atau ACARA TERSIMPAN
  • Menggunakan ekstensi mysql yang sudah usang (tetapi inilah mengapa Anda menginginkan versi PDO, bukan?)
  • Menggunakan addlashes() alih-alih fungsi escaping MySQL yang tepat.
  • Menambahkan semua data untuk semua tabel menjadi satu string yang sangat panjang, sebelum mengeluarkan seluruh konten. Ini berarti Anda harus dapat menyimpan seluruh database Anda dalam satu string, yang hampir pasti akan menghabiskan batas memori maksimal PHP Anda.

Lihat juga jawaban saya sebelumnya tentang skrip cadangan David Walsh yang malang:

Kembali komentar Anda:

Baca komentar di halaman yang Anda tautkan. Banyak orang telah mengidentifikasi masalah, dan beberapa memiliki perbaikan atau setidaknya saran.

Fakta bahwa skrip ini menambahkan semuanya ke dalam satu string adalah pemecah kesepakatan, saya pikir, tetapi seharusnya tidak sulit untuk mengubah skrip untuk membuka file output pertama , lalu keluarkan data setiap baris selama loop, lalu tutup file setelah loop. Itu semacam no-brainer, saya tidak yakin mengapa skrip tidak melakukan itu. Namun cukup jelas bahwa skrip tersebut tidak diuji dengan baik.

Tapi bagaimanapun, saya tidak akan mencoba untuk menemukan kembali roda ini. Mysqldump atau mydumper melakukan pekerjaan ini dengan baik. FWIW, Anda tidak harus menjalankan mysqldump di server yang sama tempat database berada. Mysqldump mendukung opsi untuk --host sehingga Anda dapat menjalankan mysqldump di mana saja untuk mencadangkan basis data jarak jauh, selama firewall tidak menghalangi klien Anda untuk terhubung. Pada dasarnya, jika Anda dapat menghubungkan aplikasi PHP ke database dari beberapa host klien, Anda dapat menghubungkan mysqldump.

Jika itu bukan pilihan, maka saya akan menggunakan fitur dump database dari phpmyadmin. Ini matang dan teruji dengan baik dan mereka membuang semuanya dengan benar. Berikut artikel yang menjelaskan cara menggunakan fitur dump:

http://www.techrepublic. com/blog/smb-technologist/import-and-export-databases-using-phpmyadmin/

[Menyalin komentar saya dari jawaban Anda:]

Ini masuk ke tinjauan kode, yang bukan merupakan tujuan dari StackOverflow. Tapi singkatnya:

  • tidak ada dukungan yang tepat untuk NULL (Anda mengubahnya menjadi '');
  • tidak secara konsisten membatasi nama tabel;
  • menggunakan tanda kutip ganda non-ANSI sebagai pembatas string;
  • menggunakan kueri buffer pada tabel besar akan merusak batas memori maksimal PHP;
  • menambahkan semua baris untuk tabel besar akan merusak batas memori maksimal PHP;
  • menggunakan addlashes() sebagai ganti PDO::quote();
  • memeriksa kesalahan kueri hanya di akhir fungsi;
  • tidak memeriksa pembuatan file yang gagal;
  • ekstensi gzip mungkin tidak dimuat
  • Juga, mungkin masih belum mendukung data UTF8.

Ya, ini lebih baik daripada skrip asli David Walsh. :-)

NULL tidak sama dengan '' di SQL (kecuali di Oracle, tetapi mereka tidak sesuai dengan standar SQL dalam kasus ini). Lihat MySQL, lebih baik memasukkan NULL atau kosong tali?

Saya salah membaca kode pada masalah batas memori. Anda sedang menulis output untuk setiap baris, jadi tidak apa-apa (kecuali baris tersebut berisi gumpalan 1GB atau sesuatu).

Tetapi Anda tidak boleh hanya menampilkan satu pernyataan INSERT dengan serangkaian baris yang dipisahkan koma. Bahkan mysqldump --extended-insert menghasilkan panjang data yang terbatas, kemudian memulai pernyataan INSERT baru. Kriterianya adalah apakah panjang pernyataan INSERT cocok dengan argumen opsi untuk --net-buffer-length .

Dalam ANSI SQL, tanda kutip tunggal '' digunakan untuk membatasi literal string atau literal tanggal. Tanda kutip ganda "" digunakan untuk membatasi pengidentifikasi seperti nama tabel atau nama kolom. Secara default, MySQL memperlakukan mereka sama, tetapi ini tidak standar. Lihat Apakah database yang berbeda menggunakan kutipan nama yang berbeda? . Jika Anda mencoba mengimpor data cadangan di server MySQL tempat Anda memiliki SET SQL_MODE=ANSI_QUOTES , impor akan gagal.

Contoh:query('SELECT * FROM '.$table); dan sebenarnya setiap kasus lain di mana Anda menggunakan $table dalam kueri. Anda hanya membatasi tabel satu kali, dalam pernyataan INSERT, skrip Anda menghasilkan.

MySQL selalu mengenali tanda centang kembali sebagai pembatas pengenal, dan tanda kutip tunggal untuk string/tanggal. Tetapi tanda kutip ganda berubah makna tergantung pada SQL_MODE yang saya sebutkan. Anda tidak dapat berasumsi SQL_MODE mana yang berlaku pada instans MySQL yang Anda pulihkan, jadi sebaiknya Anda menggunakan tanda centang kembali untuk pengidentifikasi, dan tanda kutip tunggal untuk string. Alasan Anda membatasinya saat Anda membuat kueri tabel adalah karena Anda mungkin memiliki nama tabel yang merupakan kata-kata yang dicadangkan SQL, atau yang berisi karakter khusus, dll.

Anda dapat memasukkan semua tipe numerik tanpa pembatas. Hanya string dan tanggal yang membutuhkan pembatas. Lihat dev.mysql.com/doc/refman/5.6/en/literals.html



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP/MySQL Hapus gambar dari database

  2. Otomatiskan Penerapan MySQL atau Cluster Postgres Anda Dari Cadangan

  3. Bagaimana cara mengubah Collation Kolom tanpa kehilangan atau mengubah data?

  4. Cara efisien untuk menghitung jumlah kunci asing di tabel kedua dan menampilkannya dengan baris dari tabel pertama - PHP - MySQL

  5. Bagaimana cara menggabungkan LIKE dengan IN dalam kueri MYSQL?