Bayangkan situasi berikut: seseorang menggunakan alat umum untuk membuat cadangan seluruh database MySQL (database yang sangat besar). Ini biasanya menghasilkan file terkompresi tar dan terkompresi gzip yang berisi semua pernyataan build/populasi untuk semua tabel dalam database. Semua tabel ada dalam satu file. Hal ini juga umum terjadi ketika klien pihak ketiga menyediakan cadangan basis data.
Situasi ini menjadi menjengkelkan ketika cadangan Anda berada di area 100+ GB dan Anda hanya memerlukan satu tabel (atau setidaknya tidak semuanya). Menyebarkan ulang cadangan dalam dimensi ini dari awal (misalnya untuk pengujian) adalah pembunuh waktu yang sangat besar (menjalankan pernyataan ini bisa memakan waktu berhari-hari!), dan tentu saja menggunakan tabel berukuran 2 GB jauh lebih cepat daripada menjalankan seluruh Tabel adalah pilihan yang lebih baik untuk scripting ketika Anda benar-benar hanya membutuhkan satu tabel.
Ini adalah tugas umum di perusahaan saya sebelumnya dan sayangnya semua alat profesional tidak dapat membaca file tersebut atau macet total saat melakukannya. Solusi terakhir untuk masalah ini adalah skrip bash kecil yang saya tulis sendiri yang saya temukan di Change is Inevitable (blog pengembangan yang sangat bagus). Skrip luar biasa ini sangat mudah digunakan, cukup ekstrak tabel tertentu dari file besar (dan masukkan ke file lain) atau dapatkan satu set tabel, Anda bahkan dapat menggunakan ekspresi reguler di sini. Bagus sekali!
Kedar Perubahan tidak bisa dihindari sehingga tutorial kecil pun dibuat di Youtube, lihat videonya di postingan blog. Terima kasih banyak, kawan!
Karena postingan blog asli menampilkan skrip tanpa format, berikut kode lengkapnya lagi:
#!/bin/sh # http://kedar.nitty-witty.com #SPLIT DUMP FILE INTO INDIVIDUAL TABLE DUMPS # Text color variables txtund=$(tput sgr 0 1) # Underline txtbld=$(tput bold) # Bold txtred=$(tput setaf 1) # Red txtgrn=$(tput setaf 2) # Green txtylw=$(tput setaf 3) # Yellow txtblu=$(tput setaf 4) # Blue txtpur=$(tput setaf 5) # Purple txtcyn=$(tput setaf 6) # Cyan txtwht=$(tput setaf 7) # White txtrst=$(tput sgr0) # Text reset TARGET_DIR="." DUMP_FILE=$1 TABLE_COUNT=0 if [ $# = 0 ]; then echo "${txtbld}${txtred}Usage: sh MyDumpSplitter.sh DUMP-FILE-NAME${txtrst} -- Extract all tables as a separate file from dump." echo "${txtbld}${txtred} sh MyDumpSplitter.sh DUMP-FILE-NAME TABLE-NAME ${txtrst} -- Extract single table from dump." echo "${txtbld}${txtred} sh MyDumpSplitter.sh DUMP-FILE-NAME -S TABLE-NAME-REGEXP ${txtrst} -- Extract tables from dump for specified regular expression." exit; elif [ $# = 1 ]; then #Loop for each tablename found in provided dumpfile for tablename in $(grep "Table structure for table " $1 | awk -F"\`" {'print $2'}) do #Extract table specific dump to tablename.sql sed -n "/^-- Table structure for table \`$tablename\`/,/^-- Table structure for table/p" $1 > $TARGET_DIR/$tablename.sql TABLE_COUNT=$((TABLE_COUNT+1)) done; elif [ $# = 2 ]; then for tablename in $(grep -E "Table structure for table \`$2\`" $1| awk -F"\`" {'print $2'}) do echo "Extracting $tablename..." #Extract table specific dump to tablename.sql sed -n "/^-- Table structure for table \`$tablename\`/,/^-- Table structure for table/p" $1 > $TARGET_DIR/$tablename.sql TABLE_COUNT=$((TABLE_COUNT+1)) done; elif [ $# = 3 ]; then if [ $2 = "-S" ]; then for tablename in $(grep -E "Table structure for table \`$3" $1| awk -F"\`" {'print $2'}) do echo "Extracting $tablename..." #Extract table specific dump to tablename.sql sed -n "/^-- Table structure for table \`$tablename\`/,/^-- Table structure for table/p" $1 > $TARGET_DIR/$tablename.sql TABLE_COUNT=$((TABLE_COUNT+1)) done; else echo "${txtbld}${txtred} Please provide proper parameters. ${txtrst}"; fi fi #Summary echo "${txtbld}$TABLE_COUNT Table extracted from $DUMP_FILE at $TARGET_DIR${txtrst}"
penggunaan
Anda dapat menggunakan mysqldumpsplitter seperti ini (dengan asumsi Anda telah memasukkan skrip ke dalam arsip bernama mysqldumpsplitter.sh):
Ekstrak semua tabel file XXX ke dalam banyak file sql tunggal:
sh mysqldumpsplitter.sh XXX
Ekstrak tabel ZZZ dari file XXX ke satu file:
sh mysqldumpsplitter.sh XXX ZZZ
Ekstrak tabel melalui ekspresi reguler dokumen XXX:
sh mysqldumpsplitter.sh XXX -S REGEX