Bagaimana memulihkan basis data MySQL dari file .myd, .myi, .frm

183

Cara mengembalikan salah satu database MySQL saya dari .myd, .myi, .frmfile?

chandrajeet
sumber
10
Meskipun saya menjawab ini, itu benar-benar milik Serverfault.
derobert
31
@chandrajeet Anda harus benar-benar menerima jawaban yang paling banyak dipilih.
Menara
2
Hei chandrajeet, mengapa Anda tidak menerima jawaban derobert? Saya mengkonfirmasi itu juga berfungsi untuk saya. Bukan untukmu? stackoverflow.com/help/someone-answers
Taz

Jawaban:

173

Jika ini adalah tabel MyISAM, maka memasukkan file .FRM, .MYD, dan .MYI ke direktori database (mis., /var/lib/mysql/dbname) Akan membuat tabel itu tersedia. Tidak harus database yang sama dengan asalnya, server yang sama, versi MySQL yang sama, atau arsitektur yang sama. Anda juga mungkin perlu mengubah kepemilikan untuk folder tersebut (misalnya, chown -R mysql:mysql /var/lib/mysql/dbname)

Perhatikan bahwa izin ( GRANT, dll.) Adalah bagian dari mysqldatabase. Jadi mereka tidak akan dipulihkan bersama dengan tabel; Anda mungkin perlu menjalankan GRANTpernyataan yang sesuai untuk membuat pengguna, memberikan akses, dll. (Memulihkan mysqlbasis data dimungkinkan, tetapi Anda harus berhati-hati dengan versi MySQL dan setiap menjalankan mysql_upgradeutilitas yang diperlukan.)

Sebenarnya, Anda mungkin hanya perlu .FRM (struktur tabel) dan .MYD (data tabel), tetapi Anda harus memperbaiki tabel untuk membangun kembali .MYI (indeks).

Satu-satunya kendala adalah bahwa jika Anda menurunkan versi, sebaiknya Anda memeriksa catatan rilis (dan mungkin menjalankan tabel perbaikan). Versi MySQL yang lebih baru menambahkan fitur, tentu saja.

[Meskipun harus jelas, jika Anda mencampur dan mencocokkan tabel, integritas hubungan antara tabel tersebut adalah masalah Anda; MySQL tidak akan peduli, tetapi aplikasi Anda dan pengguna Anda mungkin. Juga, metode ini tidak bekerja sama sekali untuk tabel InnoDB. Hanya MyISAM, tetapi mengingat file yang Anda miliki, Anda memiliki MyISAM]

derobert
sumber
Apakah ini benar-benar berfungsi tanpa menambahkan entri yang sesuai ke tabel information_schema? Maksud saya MySQL perlu tahu untuk mencari file-file ini bukan?
Zenshai
4
Tabel information_schema tidak benar-benar ada, mereka hanya pandangan ke keadaan basis data internal. Lihat dev.mysql.com/doc/refman/5.0/id/information-schema.html
brian-brazil
4
Wow, saya merasa kotor, tetapi menjatuhkan seluruh direktori dari apa yang saya pikir adalah menginstal MySQL4 ke MySQL5.1 saya secara ajaib menciptakan kembali tabel. Tidak me-restart atau apapun (di windows).
Dave
4
Ini bekerja, Anda hanya perlu mengingat untuk menjalankan (untuk setiap tabel): check table sometable; dan kemudian menjalankan perbaikan (hanya jika diperlukan): repair table sometable;
Nux
3
Ini bekerja dengan baik! Saya telah meletakkan file di tempatnya, tetapi mysql tidak "melihat" mereka sampai saya mengubah kepemilikan menjadi "mysql: mysql".
sean.boyer
26

Perhatikan bahwa jika Anda ingin membangun kembali file MYI maka penggunaan REPAIR TABLE yang benar adalah:

REPAIR TABLE USE_FRM yang mungkin;

Kalau tidak, Anda mungkin hanya akan mendapatkan kesalahan lain.

mcardellg
sumber
24

Saya baru saja menemukan solusi untuk ini. Saya menggunakan MySQL 5.1 atau 5.6 pada Windows 7.

  1. Salin file .frm dan ibdata1 dari file lama yang terletak di "C: \ Program Data \ MySQL \ MSQLServer5.1 \ Data"
  2. Hentikan instance SQL server dalam instance SQL saat ini
  3. Pergi ke folder data yang terletak di "C: \ Program Data \ MySQL \ MSQLServer5.1 \ Data"
  4. Tempel ibdata1 dan folder basis data Anda yang berisi file .frm dari file yang ingin Anda pulihkan.
  5. Mulai instance MySQL.

Tidak perlu menemukan file .MYI dan .MYD untuk pemulihan ini.

alnel
sumber
Ikuti langkah-langkah ini (setelah semuanya gagal) dan gunakan innodb_force_recovery = 4level (tidak yakin itu diperlukan dalam kasus ini). Untunglah!
Joshua Stewardson
6
FYI: ibdata1InnoDB, bukan MyISAM.
derobert
14

Satu hal yang perlu diperhatikan:

File .FRM memiliki struktur tabel di dalamnya, dan khusus untuk versi MySQL Anda.

File .MYD TIDAK spesifik untuk versi, setidaknya bukan versi minor.

File .MYI spesifik, tetapi dapat ditinggalkan dan dibuat kembali dengan REPAIR TABLEseperti jawaban lainnya.

Inti dari jawaban ini adalah untuk memberi tahu Anda bahwa jika Anda memiliki skema penumpahan tabel Anda, maka Anda dapat menggunakannya untuk menghasilkan struktur tabel, lalu ganti file .MYD tersebut dengan cadangan Anda, hapus file MYI, dan perbaiki mereka semua. Dengan cara ini Anda dapat mengembalikan cadangan ke versi MySQL lain, atau memindahkan basis data Anda sama sekali tanpa menggunakan mysqldump. Saya menemukan ini sangat membantu ketika memindahkan basis data besar.

Brent
sumber
14

Sederhana! Buat basis data dummy (mis. Abc)

Salin semua file .myd, .myi, .frm ini ke mysql \ data \ abc dimana mysql \ data \ adalah tempat penyimpanan .myd, .myi, .frm untuk semua basis data.

Lalu pergi ke phpMyadmin, pergi ke db abc dan Anda menemukan database Anda.

Vishal
sumber
jawaban terpendek dan tepat
Serak Shiferaw
Cara terbaik untuk memulihkan data ... Saya menginstal WAMP, lalu membuat database baru, menyalin file di direktori database baru C: \ WAMP64 \ bin \ mysql \ mysqlxx \ data \ newdatabase buka phpmyadmin dan database baru Anda, Anda akan lihat data
Alexandre georges
7

Saya pikir .myi Anda dapat memperbaiki dari dalam mysql.

Jika Anda melihat jenis pesan kesalahan ini dari MySQL: Database gagal menjalankan query (query) 1016: Tidak dapat membuka file: 'sometable.MYI'. (errno: 145) Kesalahan Msg: 1034: File kunci untuk tabel salah: 'kadang-kadang'. Cobalah untuk memperbaikinya maka Anda mungkin memiliki tabel rusak atau rusak.

Anda dapat memeriksa dan memperbaiki tabel dari prompt mysql seperti ini:

check table sometable;
+------------------+-------+----------+----------------------------+
| Table | Op | Msg_type | Msg_text | 
+------------------+-------+----------+----------------------------+ 
| yourdb.sometable | check | warning | Table is marked as crashed | 
| yourdb.sometable | check | status | OK | 
+------------------+-------+----------+----------------------------+ 

repair table sometable;
+------------------+--------+----------+----------+ 
| Table | Op | Msg_type | Msg_text | 
+------------------+--------+----------+----------+ 
| yourdb.sometable | repair | status | OK | 
+------------------+--------+----------+----------+

dan sekarang meja Anda harus baik-baik saja:

check table sometable;
+------------------+-------+----------+----------+ 
| Table | Op | Msg_type | Msg_text |
+------------------+-------+----------+----------+ 
| yourdb.sometable | check | status | OK |
+------------------+-------+----------+----------+
Elzo Valugi
sumber
6

Saya menemukan solusi untuk mengkonversi file ke .sqlfile (Anda kemudian dapat mengimpor .sqlfile ke server dan memulihkan database), tanpa perlu mengakses /vardirektori, oleh karena itu Anda tidak perlu menjadi admin server untuk melakukan ini.

Itu memang membutuhkan XAMPP atau MAMP yang diinstal pada komputer Anda.

  • Setelah Anda menginstal XAMPP, navigasikan ke direktori instal (Biasanya C:\XAMPP), dan sub-direktori mysql\data. Jalan penuh seharusnyaC:\XAMPP\mysql\data
  • Di dalam Anda akan melihat folder dari database lain yang telah Anda buat. Salin & Tempel folder yang penuh .myd, .myidan .frmfile ke sana. Path ke folder itu seharusnya

    C:\XAMPP\mysql\data\foldername\.mydfiles

  • Kemudian kunjungi localhost/phpmyadmindi browser. Pilih database yang baru saja Anda tempelkan ke mysql\datafolder, dan klik Ekspor di bilah navigasi. Pilih ekspor sebagai .sqlfile. Maka akan muncul menanyakan di mana menyimpan file

Dan itu dia! Anda (seharusnya) sekarang memiliki .sqlfile yang berisi database yang awalnya .myd, .myidan .frmfile. Anda kemudian dapat mengimpornya ke server lain melalui phpMyAdmin dengan membuat database baru dan menekan 'Impor' di bilah navigasi, kemudian ikuti langkah-langkah untuk mengimpornya

Kaspar Lee
sumber
5

Anda dapat menyalin file ke direktori subdirektori bernama folder data selama itu adalah versi yang sama persis dari mySQL dan Anda telah mempertahankan semua file terkait di direktori itu. Jika Anda tidak memiliki semua file, saya yakin Anda akan memiliki masalah.

cgp
sumber
Jika saya tidak memiliki MySQL versi EXACT yang sama, apa yang harus saya lakukan?
Jo Sprague
2

Deskripsi di atas tidak cukup untuk membuat hal-hal bekerja untuk saya (mungkin padat atau malas) jadi saya membuat skrip ini setelah saya menemukan jawaban untuk membantu saya di masa depan. Semoga ini bisa membantu orang lain

vim fixperms.sh 

#!/bin/sh
for D in `find . -type d`
do
        echo $D;
        chown -R mysql:mysql $D;
        chmod -R 660 $D;
        chown mysql:mysql $D;
        chmod 700 $D;
done
echo Dont forget to restart mysql: /etc/init.d/mysqld restart;
dny238
sumber
-2

Bagi mereka yang memiliki Windows XP dan MySQL server 5.5 diinstal - lokasi untuk database adalah C: \ Documents and Settings \ All Users \ Data Aplikasi \ MySQL \ MySQL Server 5.5 \ data, kecuali jika Anda mengubah lokasi dalam instalasi MySql Workbench GUI.

Setan
sumber
3
Pertanyaannya adalah tentang memulihkan dari jenis file tertentu, bukan di mana file-file itu dapat ditemukan pada Windows XP MySQL 5.5.
Danpe