Saya memiliki cadangan mysqldump dari database mysql saya yang terdiri dari semua tabel kami yaitu sekitar 440 MB. Saya ingin mengembalikan konten hanya dari satu tabel dari mysqldump. Apakah ini mungkin? Secara teoritis, saya hanya bisa memotong bagian yang membangun kembali tabel yang saya inginkan tetapi saya bahkan tidak tahu cara mengedit dokumen teks dengan ukuran itu secara efektif.
194
Jawaban:
Anda dapat mencoba menggunakan sed untuk mengekstrak hanya tabel yang Anda inginkan.
Katakanlah nama tabel Anda
mytable
dan file mysql.dump adalah file yang berisi dump besar Anda:Ini akan menyalin dalam file
mytable.dump
yang terletak di antaraCREATE TABLE mytable
dan yang berikutnyaCREATE TABLE
sesuai dengan tabel berikutnya.Anda kemudian dapat menyesuaikan file
mytable.dump
yang berisi struktur tabelmytable
, dan data (daftarINSERT
).sumber
Table structure for table
komentar, daripada mencocokkan dengan CREATE TABLE. Ini akan memastikan bahwa tabel berikutnya tidak akan turun jika seseorang lupa untuk menghapus pernyataan DROP TABLE, dan memungkinkan pemipaan untuk pengembalian tabel perintah tunggal (gzip | sed | mysql). Namun, solusi ini tergantung pada sintaks komentar mysqldump (saya tidak tahu bagaimana standarnya).Saya menggunakan versi modifikasi dari perintah sed uloBasEI. Ini termasuk perintah DROP sebelumnya, dan membaca sampai mysql selesai membuang data ke meja Anda (UNLOCK). Bekerja untuk saya (kembali) mengimpor wp_users ke banyak situs Wordpress.
sumber
`mytable`
untuk menghindari tabel yang cocokmytable2
dan seterusnya seperti dalam kasus saya.sed
seharusnya tidak mengganggu pengodean ...DROP TABLE
(dump MySQL saya tidak memiliki ini) mungkin ingin menggunakan:sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql
Ini menggunakan komentar tabel yang diberikan sebelum setiap tabel dalam dump MySQl, dan memastikan baris seperti/*!40101 SET @saved_cs_client = @@character_set_client */;
disertakan.Ini bisa dilakukan dengan lebih mudah? Beginilah cara saya melakukannya:
Buat basis data sementara (mis. Pulihkan):
Kembalikan dump penuh di database temp:
Buang tabel yang ingin Anda pulihkan:
Impor tabel di database lain:
sumber
Solusi sederhana adalah dengan membuat dump hanya dari tabel yang ingin Anda pulihkan secara terpisah. Anda dapat menggunakan perintah mysqldump untuk melakukannya dengan sintaks berikut:
Kemudian impor seperti biasa, dan itu hanya akan mengimpor tabel yang dibuang.
sumber
Dengan satu atau lain cara, proses apa pun yang harus melalui seluruh teks dump dan menguraikannya dengan cara tertentu. Saya hanya akan menerima
dan pipa output ke mysql. Lihatlah tabel pertama di dump sebelumnya, untuk memastikan Anda mendapatkan INSERT dengan cara yang benar.
Sunting: Oke, perbaiki pemformatan kali ini.
sumber
Anda harus mencoba perintah @bryn tetapi dengan `pembatas jika tidak, Anda juga akan mengekstrak tabel yang memiliki awalan atau akhiran, inilah yang biasanya saya lakukan:
Juga untuk tujuan pengujian, Anda mungkin ingin mengubah nama tabel sebelum mengimpor:
Untuk mengimpor Anda dapat menggunakan perintah mysql:
sumber
Cadangkan
Pulihkan satu tabel
sumber
Salah satu cara yang mungkin untuk mengatasinya adalah dengan mengembalikan ke basis data sementara, dan membuang hanya tabel itu dari basis data sementara. Kemudian gunakan skrip baru.
sumber
Alat ini mungkin adalah apa yang Anda inginkan: tbdba-restore-mysqldump.pl
https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl
mis. Kembalikan tabel dari file dump basis data:
sumber
Ini adalah solusi yang lebih baik daripada beberapa yang lain di atas karena tidak semua SQL dumps berisi
DROP TABLE
pernyataan. Yang ini akan bekerja akan semua jenis kesedihan.sumber
Ini mungkin membantu juga.
sumber
Tabel harus menyajikan struktur yang sama di dump dan database.
atau
sumber
Sebagian besar editor teks modern harus dapat menangani file teks sebesar itu, jika sistem Anda sesuai dengan itu.
Bagaimanapun, saya harus melakukannya sekali dengan sangat cepat dan saya tidak punya waktu untuk menemukan alat apa pun. Saya membuat instance MySQL baru, mengimpor seluruh cadangan dan kemudian memuntahkan hanya tabel yang saya inginkan.
Lalu saya mengimpor tabel itu ke database utama.
Itu membosankan tetapi agak mudah. Semoga berhasil.
sumber
Anda dapat menggunakan vi editor. Tipe:
untuk membuka seluruh dump
mysql.dump
dan file barumytable.dump
. Temukan penyisipan yang sesuai dengan menekan/
dan kemudian ketik frasa, misalnya: "masukkan ke dalam` mytable` ", lalu salin baris itu menggunakanyy
. Beralih ke file berikutnyactrl+w
saat itudown arrow key
, tempelkan baris yang disalinpp
. Akhirnya simpan file baru dengan mengetik:wq
dan cukup vi editor oleh:q
.Perhatikan bahwa jika Anda telah membuang data menggunakan banyak sisipan, Anda dapat menyalin (menarik) semuanya sekaligus menggunakan
Nyy
yangN
merupakan jumlah baris yang akan disalin.Saya telah melakukannya dengan file berukuran 920 MB.
sumber
Dapatkan editor teks yang layak seperti Notepad ++ atau Vim (jika Anda sudah mahir melakukannya). Cari nama tabel dan Anda harus bisa menyorot perintah CREATE, ALTER, dan INSERT untuk tabel itu. Mungkin lebih mudah menavigasi dengan keyboard Anda daripada menggunakan mouse. Dan saya akan memastikan Anda menggunakan mesin dengan banyak atau RAM sehingga tidak akan memiliki masalah memuat seluruh file sekaligus. Setelah Anda menyorot dan menyalin baris yang Anda butuhkan, itu akan menjadi ide yang baik untuk membuat cadangan hanya bagian yang disalin ke file cadangan sendiri dan kemudian mengimpornya ke MySQL.
sumber
Potongan SQL diblokir dengan "Struktur tabel untuk tabel
my_table
" dan "Membuang data untuk tabelmy_table
."Anda dapat menggunakan baris perintah Windows sebagai berikut untuk mendapatkan nomor baris untuk berbagai bagian. Sesuaikan string yang dicari sesuai kebutuhan.
temukan / n "untuk tabel` "sql.txt
Berikut ini akan dikembalikan:
---------- SQL.TXT
[4384] - Struktur tabel untuk tabel
my_table
[4500] - Membuang data untuk tabel
my_table
[4514] - Struktur tabel untuk tabel
some_other_table
... dll.
Itu memberi Anda nomor baris yang Anda butuhkan ... sekarang, jika saya hanya tahu bagaimana menggunakannya ... menyelidiki.
sumber
Kembali di '08 saya harus melakukan ini juga. Saya menulis naskah Perl yang akan melakukannya, dan sekarang metode pilihan saya. Juga diringkas bagaimana melakukannya dalam awk atau cara mengembalikan di tempat lain dan mengekstrak. Baru-baru ini saya menambahkan metode sed ini ke daftar juga. Anda dapat menemukan skrip dan metode lainnya di sini: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html
sumber
Saya mencoba beberapa opsi, yang sangat lambat. Ini membagi dump 360GB ke dalam tabelnya dalam beberapa menit:
Bagaimana cara membagi output dari mysqldump menjadi file yang lebih kecil?
sumber
Solusi 'sed' yang disebutkan sebelumnya bagus tetapi seperti yang disebutkan tidak 100% aman
Anda mungkin memiliki perintah INSERT dengan data yang mengandung: ... CREATE TABLE ... (apa pun) ... mytable ...
atau bahkan string yang tepat "CREATE TABLE` mytable`; " jika Anda menyimpan perintah DML misalnya!
(dan jika meja sangat besar Anda tidak ingin memeriksanya secara manual)
Saya akan memverifikasi sintaks yang tepat dari versi dump yang digunakan, dan memiliki pencarian pola yang lebih ketat:
Hindari ". *" Dan gunakan "^" untuk memastikan kita mulai dari awal baris. Dan saya lebih suka mengambil 'DROP' awal
Secara keseluruhan, ini bekerja lebih baik untuk saya:
sumber