khôi phục bảng từ tập tin .frm và .ibd?


36

Trước đây tôi đã lưu một bản sao của thư mục / var / lib / mysql / ddms ("ddms" là tên lược đồ). Bây giờ tôi đã cài đặt một MySQL mới trên Ubuntu 10.04.3 LTS mới cài đặt bằng cách chạy apt-get install mysql-server, tôi tin rằng phiên bản 5.1 đã được cài đặt. Sau khi tôi sao chép thư mục ddms bên dưới / var / lib / mysql, một số bảng của nó hoạt động tốt, đây là các bảng có một bộ gồm ba tệp: tệp .frm, tệp .MYD và tệp .MYI.

Tuy nhiên, có hai bảng với một tập hợp các tệp khác nhau: tệp .frm và tệp .ibd. Hai bảng này không hiển thị trong danh sách bảng trong phpMyAdmin. Khi tôi nhìn vào nhật ký lỗi, nó báo:

[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.

Xin hãy giúp khôi phục hai bảng này. Cảm ơn.


Báo giá này từ ngày 23, 12 tháng 4 bởi Rolando vẫn còn hiệu lực cho đến ngày hôm nay. 'Chỉ cần sao chép các tệp .frm và .ibd từ vị trí này sang vị trí khác là yêu cầu sự cố.' Sử dụng thay thế như mysqldump để đưa dữ liệu cũ của bạn vào một biểu mẫu có thể được tải như kế hoạch nhiều năm trước. Còn được gọi là một bản sao lưu.
Wilson Hauck

Câu trả lời:


37

Các bảng InnoDB không thể được sao chép giống như các bảng MyISAM có thể.

Chỉ cần sao chép các tệp .frm và .ibd từ vị trí này sang vị trí khác là yêu cầu sự cố. Sao chép tệp .frm và .ibd của bảng InnoDB chỉ tốt khi và chỉ khi bạn có thể đảm bảo rằng id vùng bảng của tệp .ibd khớp chính xác với mục nhập id vùng bảng trong metdata của tệp ibdata1 .

Tôi đã viết hai bài đăng trong DBA StackExchange về khái niệm id không gian bảng này

Đây là liên kết tuyệt vời về cách gắn lại bất kỳ tệp .ibd nào vào ibdata1 trong trường hợp id không gian bảng không khớp: http : //www.chrryptender.com/?tag=innodb-error-tablespace-id-in-file . Sau khi đọc nó, bạn sẽ nhận ra ngay rằng việc sao chép các tệp .ibd chỉ là điên rồ.

Bạn có thể áp dụng các đề xuất từ ​​liên kết Lịch Chris hoặc bạn có thể quay lại cài đặt cũ của mysql, khởi động mysql và sau đó mysqldump ddmscơ sở dữ liệu. Sau đó, nhập mysqldump vào ví dụ mysql mới của bạn. Hãy tin tôi, điều này sẽ dễ dàng hơn nhiều.


Vì vậy, một bảng duy nhất có thể không phải là một ý tưởng tốt, nhưng còn toàn bộ cơ sở dữ liệu tại thời điểm đó thì sao? Tôi đã bị hỏng bảng người dùng và tôi phải thực hiện --initialize trên mysqld. Tôi có thể sao chép toàn bộ thư mục cơ sở dữ liệu InoDB từ thư mục data_backup không?
FMaz008

Rolando, chỉ trong trường hợp bạn có thể giúp tôi: serverfault.com/q/908988/224334
Ionică Bizău

Bài viết của bạn trên How to Recover an InnoDB table whose files were moved around nghĩa đen đã cứu cuộc đời tôi. Cảm ơn nhiều.
Paulo Griiettner

20

Gần đây tôi đã trải qua vấn đề tương tự. Dưới đây là các bước tôi đã sử dụng để giải quyết nó mà không phải loay hoay với id vùng bảng như RolandoMyQueryDBA đã đề cập ở trên. Tôi đang dùng Mac và vì vậy tôi đã sử dụng MAMP để khôi phục Cơ sở dữ liệu đến điểm mà tôi có thể xuất nó trong một bãi chứa MySQL.

Bạn có thể đọc toàn bộ bài đăng trên blog về nó tại đây: http://www.quora.com/Jordan-Ryan/Web-Dev/How-to-Recover-innoDB-MyQuery-files-USE-MAMP-on-a-Mac

Bạn phải có:

-ibdata1

-ib_logfile0

-ib_logfile1

Tập tin -.FRM từ thư mục mysql_database của bạn

Cài đặt -Fresh của MAMP / MAMP Pro mà bạn sẵn sàng phá hủy (nếu cần)

  1. SSH vào máy chủ web của bạn (dev, sản xuất, không có sự khác biệt) và duyệt đến thư mục mysql của bạn (của tôi là tại / var / lib / mysql để cài đặt Plesk trên Linux)
  2. Nén thư mục mysql
  3. Tải xuống một kho lưu trữ thư mục mysql chứa tất cả các cơ sở dữ liệu myQuery, cho dù MyISAM hay innoDB (bạn có thể quét tệp này hoặc di chuyển tệp này sang thư mục có thể tải xuống, nếu cần)
  4. Cài đặt MAMP (Mac, Apache, MySQL, PHP)
  5. Duyệt đến / Ứng dụng / MAMP / db / mysql /
  6. Sao lưu / Ứng dụng / MAMP / db / mysql vào kho lưu trữ zip (chỉ trong trường hợp)
  7. Sao chép trong tất cả các thư mục và tệp có trong kho lưu trữ của thư mục mysql từ máy chủ sản xuất (môi trường mt Plesk trong trường hợp của tôi) NGOẠI TRỪ KHÔNG QUÁ TUYỆT VỜI:

    - / Ứng dụng / MAMP / db / mysql / mysql /

    - / Ứng dụng / MAMP / db / mysql / mysql_upTHER_info

    - / Ứng dụng / MAMP / db / mysql / Performance_schema

  8. Và voila, bây giờ bạn có thể truy cập cơ sở dữ liệu từ phpMyAdmin, thật là nhẹ nhõm!

Nhưng chúng tôi chưa hoàn thành, bây giờ bạn cần thực hiện một mysqldump để khôi phục các tệp này vào môi trường sản xuất của bạn và giao diện phpmyadmin hết thời gian cho các cơ sở dữ liệu lớn. Thực hiện theo các bước ở đây:

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

Sao chép dưới đây để tham khảo. Lưu ý rằng trên bản cài đặt MAMP mặc định, mật khẩu là "root".

Cách chạy mysqldump cho MAMP bằng Terminal

XUẤT NHẬP KHẨU TỪ MAMP [1]

Bước một: Mở cửa sổ terminal mới

Bước hai: Điều hướng đến cài đặt MAMP bằng cách nhập dòng sau vào thiết bị đầu cuối cd / ứng dụng / MAMP / library / bin Nhấn phím enter

Bước ba: Viết lệnh kết xuất ./mysqldump -u [USERNAME] -p [DATA_BASENAME]> [PATH_TO_FILE] Nhấn phím enter

Thí dụ:

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

Mẹo nhanh: để điều hướng đến thư mục một cách nhanh chóng, bạn có thể kéo thư mục vào cửa sổ terminal và nó sẽ ghi vị trí của thư mục. Đó là một ngày tuyệt vời khi ai đó chỉ cho tôi điều này.

Bước bốn: Dòng văn bản này sẽ xuất hiện sau khi bạn nhấn Enter nhập mật khẩu: Vì vậy, hãy đoán xem, nhập mật khẩu của bạn, hãy nhớ rằng các chữ cái sẽ không xuất hiện, nhưng chúng ở đó Nhấn phím Enter

Bước năm: Kiểm tra vị trí nơi bạn lưu trữ tệp của mình, nếu có, SUCCESS Bây giờ bạn có thể nhập cơ sở dữ liệu, sẽ được phác thảo tiếp theo.

Bây giờ bạn đã xuất một cơ sở dữ liệu mysql của bạn, bạn có thể nhập nó trên môi trường sản xuất.


1
Vẫn hoạt động như năm 2018. Câu trả lời này là vàng. Phần quan trọng đối với tôi là số 7, đó là những tệp bạn hoàn toàn phải giữ (nó không được đề cập ở bất kỳ nơi nào khác về các giải pháp tương tự, cảm ơn vì điều đó @jordan).
Bigood

@Bigood rất vui vì nó vẫn giúp!
jordan8037310

nhận được lỗi bảng 1146 không tồn tại khi thực hiện kết xuất
Robert Sinclair

15

Tôi đã khôi phục các tệp MySQL 5.5 * .ibd và * .frm của mình bằng cách sử dụng MySQL Utilites và MariaDB 10.

1) Tạo SQL.
Bạn có thể nhận được tạo sql của bạn từ tập tin frm. Bạn phải sử dụng: 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

Cách khác bạn có thể tạo sql's.

2) Tạo bảng của bạn
Tạo các bảng của bạn trên cơ sở dữ liệu.

3) thay đổi bảng xxx loại bỏ không gian bảng
Hủy bỏ các bảng mà bạn muốn thay thế các tệp * .ibd của mình.

4) Sao chép các tệp * .ibd của bạn (MySQL Hoặc MariaDB) vào đường dẫn dữ liệu của MariaDB
Trước tiên tôi thử sử dụng MySQL 5.5 và 5.6 để khôi phục, nhưng cơ sở dữ liệu gặp sự cố và dừng ngay lập tức về lỗi không gian bảng id. ( LRI 1030 (HY000): Đã xảy ra lỗi -1 từ công cụ lưu trữ )
Sau khi tôi đã sử dụng MariaDB 10.1.8 và tôi đã khôi phục dữ liệu của mình.

5) thay đổi không gian bảng nhập xxx bảng
Khi bạn chạy câu lệnh này, MariaDB cảnh báo về tệp nhưng không quan trọng hơn là khôi phục dữ liệu của bạn :) Cơ sở dữ liệu vẫn tiếp tục và bạn có thể thấy dữ liệu của mình.

Tôi hy vọng thông tin này sẽ hữu ích cho bạn.


1
Điều này làm việc cho tôi. Mặc dù mysqlfrm(đã thử các phiên bản 1.3.5 và 1.6.5 với MySQL 5.6 và 5.7) không cho CREATEđịnh nghĩa chính xác , ngay cả khi sử dụng MySQL 5.7 ( ROW_FORMAT mặc định đã thay đổi trong MySQL 5.7.9 ) dẫn đến Schema mismatch (Expected FSP_SPACE_FLAGS=0x21, .ibd file contains 0x0.)khi nhập không gian bảng. Thêm thủ công ROW_FORMAT=compactvào cuối CREATEbản tuyên bố đã thực hiện thủ thuật.
Jāni Elmeris

@ JānisElmeris> Manually adding ROW_FORMAT=compact at the end of the CREATE statement did the trick.Điều đó cũng làm việc cho tôi. Cảm ơn! 👍
Synetech

3

Tôi đã có cùng một vấn đề chính xác chỉ có các tập tin như sao lưu.

Những gì tôi đã làm để giải quyết nó là sao chép các tệp cơ sở dữ liệu vào / var / lib / mysql / yourdb và ibdata1 được đặt trong / var / lib / mysql.

Sau đó tôi đã có thể xác minh rằng tôi có thể truy cập các bảng tên mysql -u root -p và truy vấn một số bảng đã bị hỏng trước đó.

Sau đó, tôi đã tạo một kết xuất cơ sở dữ liệu với mysqldump -u root -p [root_password] [database_name]> dumpfilename.sql


2

Nếu bạn đang sử dụng MAMP và bạn không thể khởi động MySQL sau khi bạn sao chép các tệp của mình, tôi đã đặt innodb_force_recovery = 2vào bên trong my.inivà sau đó tôi có thể yêu cầu mysql khởi chạy và xuất db của mình.


1

Nếu bạn có thể khôi phục tệp * .ibd về máy chủ MySQL gốc, đừng quên khôi phục quyền truy cập tệp. Trong trường hợp của tôi (MySQL8 trên CentOS7), tôi đã khôi phục tệp thành /var/lib/mysql/db/tablename.ibd và chạy:

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

Trước khi sửa quyền truy cập, việc truy cập bảng dẫn đến lỗi "Máy chủ MySQL 2006 đã biến mất". Sau khi sửa quyền truy cập, bảng đã hoạt động (ngay cả khi không khởi động lại dịch vụ mysqld).


0

Tôi đã thu thập các bài đăng từ các chủ đề tương tự (Câu trả lời của ai không được đăng ở đây):

giải pháp 1: https://dba.stackexchange.com/a/59978

giải pháp 2: https://dba.stackexchange.com/a/71785 (+ bài đăng khác ở đó)

giải pháp 3: bộ phục hồi cho các bảng: https://twindb.com/how-to-recover-innodb-dipedia/

Giải pháp 4: Khôi phục cơ sở dữ liệu MySQL từ thư mục dữ liệu không có ibdata1 từ các tệp ibd

giải pháp 5: sử dụng mysqlfrmlệnh

giải pháp 6: https://dba.stackexchange.com/a/159001

giải pháp 7: https://dba.stackexchange.com/a/144573


Điều này trông đáng ngờ giống như một câu trả lời chỉ liên kết.
mustaccio

Bởi vì tất cả các liên kết là từ trang web của chúng tôi, chúng không có khả năng biến mất, vì vậy tôi ổn với @mustaccio
jcolebrand

3
Điều này dường như không thêm nhiều giá trị, vì hầu hết trong số này cũng xuất hiện trong danh sách "Liên quan" vài pixel ở bên phải.
mustaccio

@jcolebrand cảm ơn vì đã nhẹ dạ. nhiều người không thể thấy được sự hữu ích của những câu trả lời "không trực tiếp" như vậy. Họ chỉ có thể phát hiện sự phá vỡ của các quy tắc.
T.Todua

1
Không nhưng bạn phải hiểu anh ấy đúng. Bạn đã không thêm bất kỳ giá trị. Tôi đã trả lời bằng một phán quyết theo quy tắc, không bỏ qua câu trả lời của bạn. Đó thực sự là một câu trả lời khá tệ.
jcolebrand

0

Tôi chỉ muốn thêm một điều nữa cho người dùng macos El Capitan. Các tiện ích MySQL không được hỗ trợ cho phiên bản này, vì vậy lệnh mysqlfrm không hữu ích. Những gì tôi đã làm là khôi phục các cấu trúc bảng của mình bằng dbsake như được hiển thị trong liên kết này: https://www.percona.com/blog/2015/12/16/recovering-table-structure-from-frm-files-USE-dbsake/

Tất cả bạn cần làm là cài đặt dbsake:

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

sau đó sử dụng lệnh frmdump và cung cấp đường dẫn đến tệp .frm của bạn:

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

bạn sẽ nhận được câu lệnh tạo. Khi tôi đã hoàn thành việc này, tôi chỉ cần làm theo các bước từ 2 đến 5 đã được @Ecd đề cập. Hy vọng nó sẽ giúp được ai đó.


0

Tôi thực sự đánh giá cao Ecd. Điều gì làm việc cho tôi:

1.- Tôi đã có một bản sao lưu cơ sở vài tháng trước, điều này đã giúp tôi nâng bản sao lưu này trong xampp trong Windows 10 và tạo các bảng để có cấu trúc (cấu hình: Windows 10, xampp-windows-x64-7.1.30- 5-VC14) Tập tin cấu hình mys.ini my.ini ở cuối

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.- Có cơ sở dữ liệu cũ, tôi đã tiến hành thực hiện thay đổi không gian bảng xxx cho mỗi bảng trong cơ sở dữ liệu mà tôi muốn khôi phục, sau đó các tệp .ibd của thư mục dữ liệu trong C: / xampp / mysql / data / system đã bị xóa (trong trường hợp này là đường dẫn này)

3.- Tôi đã tiến hành sao chép các tệp .ibd từ cơ sở dữ liệu mà tôi muốn khôi phục vào thư mục xampp của cơ sở dữ liệu cũ

4.- Có các tệp được sao chép, chạy: thay đổi không gian bảng nhập bảng xxx Đối với mỗi bảng trong cơ sở dữ liệu, một cảnh báo sẽ xuất hiện nhưng chúng tôi sẽ bỏ qua nó, dữ liệu sẽ được tải trong bảng và có thể được xuất sau.

5.- Xuất toàn bộ cơ sở dữ liệu thành tệp sql và tiến hành xây dựng nó trong sản xuất và thành công!

# 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

Tôi hy vọng nó sẽ giúp được ai đó có tình huống này.

Tiếng Anh do Google cung cấp


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.