pulihkan tabel dari file .frm dan .ibd?

36

Saya sebelumnya telah menyimpan salinan direktori / var / lib / mysql / ddms ("ddms" adalah nama skema). Sekarang saya menginstal MySQL baru pada Ubuntu 10.04.3 LTS yang baru diinstal dengan menjalankan apt-get install mysql-server, saya percaya versi 5.1 telah diinstal. Setelah saya menyalin direktori ddms di bawah / var / lib / mysql, beberapa tabelnya berfungsi dengan baik, ini adalah tabel dengan kumpulan tiga file yang terkait: file .frm, file .MYD, dan file .MYI.

Namun, ada dua tabel dengan kumpulan file yang berbeda: file .frm dan file .ibd. Dua tabel ini tidak muncul dalam daftar tabel di phpMyAdmin. Ketika saya melihat log kesalahan, ia mengatakan:

[ERROR] Cannot find or open table ddms/dictionary_item from
the internal data dictionary of InnoDB though the .frm file for the
table exists. Maybe you have deleted and recreated InnoDB data
files but have forgotten to delete the corresponding .frm files
of InnoDB tables, or you have moved .frm files to another database?
or, the table contains indexes that this version of the engine
doesn't support.

Tolong bantu dengan mengembalikan dua tabel ini. Terima kasih.

Tong Wang
sumber
Kutipan dari 23 April 12 oleh Rolando ini masih berlaku hari ini. 'Hanya menyalin file .frm dan .ibd dari satu lokasi ke lokasi lain sedang mencari masalah.' Gunakan alternatif seperti mysqldump untuk mendapatkan data lama Anda ke dalam formulir yang dapat dimuat seperti yang direncanakan tahun lalu. Juga dikenal sebagai cadangan.
Wilson Hauck

Jawaban:

37

Tabel InnoDB tidak dapat disalin dengan cara yang sama seperti tabel MyISAM.

Hanya menyalin file .frm dan .ibd dari satu lokasi ke lokasi lain sedang mengalami masalah. Menyalin file .frm dan .ibd dari tabel InnoDB hanya baik jika dan hanya jika Anda dapat menjamin bahwa id tablespace dari file .ibd cocok persis dengan entri tablespace tablesd dalam metdata dari file ibdata1 .

Saya menulis dua posting di DBA StackExchange tentang konsep id tablespace ini

Berikut ini adalah tautan bagus tentang cara memasang kembali file .ibd ke ibdata1 jika id tablespace tidak cocok: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Setelah membaca ini, Anda harus segera menyadari bahwa menyalin file .ibd benar-benar gila.

Anda dapat menerapkan saran dari tautan Kalender Chris, atau Anda dapat kembali ke instalasi lama mysql, memulai Facebook mysql, dan kemudian mysqldump ddmsdatabase. Kemudian, impor mysqldump ke instance mysql baru Anda. Percayalah, ini akan jauh lebih mudah.

RolandoMySQLDBA
sumber
Jadi satu tabel mungkin bukan ide yang baik, tetapi bagaimana dengan seluruh database saat itu? Tabel user saya rusak parah dan saya harus melakukan - menginisialisasi pada mysqld. Bisakah saya menyalin seluruh folder basis data InoDB dari folder data_backup?
FMaz008
Rolando, kalau-kalau Anda dapat membantu saya: serverfault.com/q/908988/224334
Ionică Bizău
Pos Anda di How to Recover an InnoDB table whose files were moved around benar-benar menyelamatkan hidup saya. Terima kasih banyak.
Paulo Griiettner
20

Baru-baru ini saya mengalami masalah yang sama. Berikut adalah langkah-langkah yang saya gunakan untuk menyelesaikannya tanpa harus dipusingkan dengan tablespace id seperti yang disebutkan RolandoMySQLDBA di atas. Saya menggunakan Mac dan jadi saya menggunakan MAMP untuk mengembalikan Database ke titik di mana saya bisa mengekspornya di dump MySQL.

Anda dapat membaca posting blog lengkap tentang hal itu di sini: http://www.quora.com/Jordan-Ryan/Web-Dev/Bagaimana- untuk- Pulihkan-innoDB-MySQL-files-using-MAMP-on-a- Mac

Anda harus memiliki:

-ibdata1

-ib_logfile0

-ib_logfile1

File -.FRM dari folder mysql_database Anda

-Instalasi baru dari MAMP / MAMP Pro yang ingin Anda hancurkan (jika perlu)

  1. SSH ke server web Anda (dev, produksi, tidak ada perbedaan) dan browse ke folder mysql Anda (milik saya di / var / lib / mysql untuk instalasi Plesk di Linux)
  2. Kompres folder mysql
  3. Unduh arsip folder mysql yang harus berisi semua database mySQL, apakah MyISAM atau innoDB (Anda dapat scp file ini, atau pindahkan ini ke direktori yang dapat diunduh, jika perlu)
  4. Instal MAMP (Mac, Apache, MySQL, PHP)
  5. Browse ke / Aplikasi / MAMP / db / mysql /
  6. Cadangkan / Aplikasi / MAMP / db / mysql ke arsip zip (untuk berjaga-jaga)
  7. Salin di semua folder dan file yang termasuk dalam arsip folder mysql dari server produksi (mt lingkungan Plesk dalam kasus saya) KECUALI JANGAN TERLALU MENYATAKAN:

    - / Aplikasi / MAMP / db / mysql / mysql /

    - / Aplikasi / MAMP / db / mysql / mysql_upgrade_info

    - / Aplikasi / MAMP / db / mysql / performance_schema

  8. Dan voila, Anda sekarang harus dapat mengakses database dari phpMyAdmin, sungguh melegakan!

Tapi kami belum selesai, Anda sekarang perlu melakukan mysqldump untuk mengembalikan file-file ini ke lingkungan produksi Anda, dan antarmuka phpmyadmin time out untuk database besar. Ikuti langkah-langkah di sini:

http://nickhardeman.com/308/export-import-large-database-using-mamp-with-terminal/

Disalin di bawah untuk referensi. Perhatikan bahwa pada instalasi MAMP default, kata sandi adalah "root".

Bagaimana menjalankan mysqldump untuk MAMP menggunakan Terminal

DATABASE EKSPOR DARI MAMP [1]

Langkah Satu: Buka jendela terminal baru

Langkah Dua: Arahkan ke instalasi MAMP dengan memasukkan baris berikut di terminal cd / aplikasi / MAMP / library / bin Tekan tombol enter

Langkah Tiga: Tulis perintah dump ./mysqldump -u [USERNAME] -p [DATA_BASENAME]> [PATH_TO_FILE] Tekan tombol enter

Contoh:

./mysqldump -u root -p wp_database > /Applications/MAMP/htdocs/symposium10_wp/wp_db_onezero.sql

Tip cepat: untuk menavigasi ke folder dengan cepat Anda dapat menyeret folder ke jendela terminal dan itu akan menulis lokasi folder. Itu adalah hari yang menyenangkan ketika seseorang menunjukkan ini kepada saya.

Langkah Empat: Baris teks ini akan muncul setelah Anda menekan enter. Masukkan kata sandi: Jadi coba tebak, ketik kata sandi Anda, perlu diingat bahwa huruf-huruf tidak akan muncul, tetapi mereka ada di sana. Tekan tombol enter.

Langkah Kelima: Periksa lokasi tempat Anda menyimpan file Anda, jika ada, SUKSES Sekarang Anda dapat mengimpor database, yang akan diuraikan selanjutnya.

Sekarang setelah Anda mengekspor database mysql Anda, Anda dapat mengimpornya di lingkungan produksi.

jordan8037310
sumber
1
Masih bekerja pada 2018. Jawaban ini adalah emas. Bagian penting bagi saya adalah # 7, itu adalah file yang harus Anda simpan (tidak disebutkan di tempat lain pada solusi yang serupa, terima kasih untuk @jordan itu).
Bigood
@Bigood senang itu masih membantu!
jordan8037310
mendapatkan error 1146 tabel tidak ada saat melakukan dump
Robert Sinclair
15

Saya telah memulihkan file MySQL 5.5 * .ibd dan * .frm saya dengan menggunakan MySQL Utilites dan MariaDB 10.

1) Menghasilkan Buat SQL.
Anda bisa mendapatkan sql dari file frm. Anda harus menggunakan: https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqlfrm.html

shell> mysqlfrm --server = root: pass @ localhost: 3306 c: \ MY \ t1.frm - -port = 3310

Cara lain Anda mungkin membuat sql Anda.

2) Buat Tabel Anda.
Buat tabel Anda di database.

3) ubah tabel xxx buang tablespace
Buang tabel Anda yang ingin Anda ganti file * .ibd Anda.

4) Salin file * .ibd Anda (MySQL Atau MariaDB) ke jalur data MariaDB
Pertama saya mencoba menggunakan MySQL 5.5 dan 5.6 untuk memulihkan, tetapi database macet dan segera berhenti tentang tablespace id broken error. ( KESALAHAN 1030 (HY000): Mendapat kesalahan -1 dari mesin penyimpanan )
Setelah saya menggunakan MariaDB 10.1.8, dan saya berhasil memulihkan data saya.

5) mengubah tabel xxx impor tablespace
Ketika Anda menjalankan pernyataan ini, MariaDB memperingatkan tentang file tetapi itu tidak penting daripada memulihkan data Anda :) Database masih berlanjut dan Anda dapat melihat data Anda.

Saya harap informasi ini bermanfaat bagi Anda.

Ecd
sumber
1
Ini berhasil untuk saya. Meskipun mysqlfrm(mencoba versi 1.3.5 dan 1.6.5 dengan MySQL 5.6 dan 5.7) tidak memberikan CREATEdefinisi yang benar , bahkan ketika menggunakan MySQL 5.7 ( ROW_FORMAT default berubah di MySQL 5.7.9 ) menghasilkan Schema mismatch (Expected FSP_SPACE_FLAGS=0x21, .ibd file contains 0x0.)ketika mengimpor tablespace. Menambahkan secara manual ROW_FORMAT=compactdi akhir CREATEpernyataan berhasil.
Jānis Elmeris
@ JānisElmeris> Manually adding ROW_FORMAT=compact at the end of the CREATE statement did the trick.Itu berhasil juga untuk saya. Terima kasih! 👍
Synetech
3

Saya memiliki masalah yang sama persis hanya memiliki file sebagai cadangan.

Apa yang saya lakukan untuk mengatasinya adalah menyalin file database ke / var / lib / mysql / yourdb dan ibdata1 yang ditempatkan di / var / lib / mysql.

Saya kemudian dapat memverifikasi bahwa saya dapat mengakses tabel mysql -u root -p dbname dan menanyakan beberapa tabel yang sebelumnya rusak.

Saya melakukan dump database setelahnya dengan mysqldump -u root -p [root_password] [database_name]> dumpfilename.sql

Sel
sumber
2

Jika Anda menggunakan MAMP dan Anda tidak bisa memulai MySQL setelah Anda menyalin file Anda, saya masukkan ke innodb_force_recovery = 2dalam my.inidan kemudian saya bisa mendapatkan mysql untuk memulai dan mengekspor db saya keluar.

Peter Wakeman
sumber
1

Jika Anda dapat mengembalikan file * .ibd ke server MySQL asli, jangan lupa untuk mengembalikan hak akses file juga. Dalam kasus saya (MySQL8 pada CentOS7), saya mengembalikan file ke /var/lib/mysql/db/tablename.ibd dan jalankan:

chown mysql tablename.ibd
chgrp mysql tablename.ibd
chmod 0640 tablename.ibd

Sebelum memperbaiki hak akses, mengakses tabel mengakibatkan kesalahan "2006 server MySQL telah pergi". Setelah memperbaiki hak akses, tabel bekerja (bahkan tanpa me-restart layanan mysqld).

Samuraj
sumber
0

Saya telah mengumpulkan posting dari topik serupa (Jawaban siapa yang tidak diposting di sini):

solusi 1: https://dba.stackexchange.com/a/59978

solusi 2: https://dba.stackexchange.com/a/71785 (+ pos lainnya di sana)

solusi 3: kit pemulihan untuk tabel: https://twindb.com/how-to-recover-innodb-dictionary/

solusi 4: Pulihkan database MySQL dari folder data tanpa ibdata1 dari file ibd

solusi 5: menggunakan mysqlfrmperintah

solusi 6: https://dba.stackexchange.com/a/159001

solusi 7: https://dba.stackexchange.com/a/144573

T.Todua
sumber
Ini terlihat mencurigakan seperti jawaban hanya tautan.
mustaccio
Karena semua tautan berasal dari situs kami sendiri, kemungkinan tidak akan hilang, jadi saya setuju dengan @mustaccio ini
jcolebrand
3
Ini tampaknya tidak menambah banyak nilai, mengingat sebagian besar dari ini juga muncul dalam daftar "Terkait" beberapa piksel di sebelah kanan.
mustaccio
@ jcolebrand, terima kasih telah berpikiran ringan. banyak orang tidak dapat melihat kegunaan bahkan dari jawaban "tidak langsung" seperti itu. Mereka hanya dapat mendeteksi pelarian aturan.
T.Todua
1
Tidak, tetapi Anda harus mengerti dia benar. Anda tidak menambahkan nilai apa pun. Saya merespons dengan penilaian aturan, tidak memaafkan jawaban Anda. Ini sebenarnya jawaban yang sangat buruk.
jcolebrand
0

Saya hanya ingin menambahkan satu hal lagi untuk pengguna macos El Capitan. Utilitas MySQL tidak didukung untuk versi ini, jadi perintah mysqlfrm tidak membantu. Apa yang saya lakukan adalah memulihkan struktur tabel saya dengan dbsake seperti yang ditunjukkan pada tautan ini: https://www.percona.com/blog/2015/12/16/recovering-table-structure-from-frm-files-using-dbsake/

Yang perlu Anda lakukan adalah menginstal dbsake:

# curl -s http://get.dbsake.net > dbsake
# chmod u+x dbsake

kemudian gunakan perintah frmdump dan berikan path ke file .frm Anda:

# ./dbsake frmdump /var/lib/mysql/sakila/staff.frm

Anda akan mendapatkan pernyataan create. Setelah saya melakukan ini, saya cukup mengikuti langkah 2 hingga 5 yang sudah disebutkan oleh @Ecd. Semoga ini bisa membantu seseorang.

pengguna2804064
sumber
0

Saya sangat menghargai Ecd. Apa yang berhasil untuk saya:

1.- Saya punya cadangan dari basis beberapa bulan yang lalu ini membantu saya untuk mengangkat cadangan ini di xampp di Windows 10 dan membuat tabel untuk memiliki struktur (konfigurasi: Windows 10, xampp-windows-x64-7.1.30.30- 5-VC14) mysql file konfigurasi my.ini di akhir

NOTE: Some tables did not have ROW_FORMAT = COMPACT, so I went to operations on each 
    table and changed it manually.
    (If I did not do that, an error appeared and I did not let the import).

NOTE2: I had the backup of months ago but it should also work by first recovering 
    the structure of the .frm files in case of not having a backup at hand.
    (You can try this link:
    https://www.percona.com/blog/2014/01/02/recover-table-structure-frm-files-mysql- 
    utilities/)

2.- Setelah database lama naik, saya melanjutkan untuk mengeksekusi tabel xxx xxx membuang tablespace untuk setiap tabel dalam database yang ingin saya pulihkan, kemudian file .ibd dari folder data di C: / xampp / mysql / data / system telah dihapus (dalam hal ini jalan ini)

3.- Saya mulai menyalin file .ibd dari database yang ingin saya pulihkan ke folder xampp dari database lama

4.- Setelah file disalin, jalankan: alter table xxx import tablespace Untuk setiap tabel dalam database, peringatan akan muncul tetapi kami akan mengabaikannya, data akan dimuat dalam tabel dan dapat diekspor nanti.

5.- Ekspor seluruh database ke file sql dan lanjutkan untuk membangunnya dalam produksi dan sukses!

# Example MySQL config file for small systems.
#
# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it's important that the mysqld daemon
# doesn't use much resources.
#
# You can copy this file to
# C:/xampp/mysql/bin/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is C:/xampp/mysql/data) or
# ~/.my.cnf to set user-specific options.
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.

# The following options will be passed to all MySQL clients
[client] 
# password       = your_password 
port            = 3306 
socket          = "C:/xampp/mysql/mysql.sock"


# Here follows entries for some specific programs 

# The MySQL server
[mysqld]
port= 3306
socket = "C:/xampp/mysql/mysql.sock"
basedir = "C:/xampp/mysql" 
tmpdir = "C:/xampp/tmp" 
datadir = "C:/xampp/mysql/data"
pid_file = "mysql.pid"
# enable-named-pipe
key_buffer = 160M
max_allowed_packet = 300M
sort_buffer_size = 1204K
net_buffer_length = 80K
read_buffer_size = 512K
read_rnd_buffer_size = 1024K
myisam_sort_buffer_size = 8M
log_error = "mysql_error.log"

# Change here for bind listening
# bind-address="127.0.0.1" 
# bind-address = ::1          # for ipv6

# Where do all the plugins live
plugin_dir = "C:/xampp/mysql/lib/plugin/" 

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
# 
# commented in by lampp security
#skip-networking
#skip-federated

# Replication Master Server (default)
# binary logging is required for replication
# log-bin deactivated by default since XAMPP 1.4.11
#log-bin=mysql-bin

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id   = 1

# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
#    the syntax is:
#
#    CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
#    MASTER_USER=<user>, MASTER_PASSWORD=<password> ;
#
#    where you replace <host>, <user>, <password> by quoted strings and
#    <port> by the master's port number (3306 by default).
#
#    Example:
#
#    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
#    MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
#    start replication for the first time (even unsuccessfully, for example
#    if you mistyped the password in master-password and the slave fails to
#    connect), the slave will create a master.info file, and any later
#    change in this file to the variables' values below will be ignored and
#    overridden by the content of the master.info file, unless you shutdown
#    the slave server, delete master.info and restart the slaver server.
#    For that reason, you may want to leave the lines below untouched
#    (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id       = 2
#
# The replication master for this slave - required
#master-host     =   <hostname>
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user     =   <username>
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =   <password>
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port     =  <port>
#
# binary logging - not required for slaves, but recommended
#log-bin=mysql-bin


# Point the following paths to different dedicated disks
#tmpdir = "C:/xampp/tmp"
#log-update = /path-to-dedicated-directory/hostname

# Uncomment the following if you are using BDB tables
#bdb_cache_size = 40M
#bdb_max_lock = 10000

# Comment the following if you are using InnoDB tables
#skip-innodb
innodb_data_home_dir = "C:/xampp/mysql/data"
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = "C:/xampp/mysql/data"
#innodb_log_arch_dir = "C:/xampp/mysql/data"
## You can set .._buffer_pool_size up to 50 - 80 %
## of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 16M
## Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 50M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 600

## UTF 8 Settings
#init-connect=\'SET NAMES utf8\'
#collation_server=utf8_unicode_ci
#character_set_server=utf8
#skip-character-set-client-handshake
#character_sets-dir="C:/xampp/mysql/share/charsets"
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION
log_bin_trust_function_creators = 1

[mysqldump]
quick
max_allowed_packet = 160M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

Saya harap ini membantu seseorang yang mengalami situasi ini, salam.

Bahasa Inggris disediakan oleh Google

Yersskit
sumber