.frm 및 .ibd 파일에서 테이블을 복원 하시겠습니까?


36

이전에 / var / lib / mysql / ddms 디렉토리의 사본을 저장했습니다 ( "ddms"는 스키마 이름입니다). 이제을 실행하여 새로 설치된 Ubuntu 10.04.3 LTS에 새 MySQL을 apt-get install mysql-server설치했습니다. 버전 5.1이 설치되어 있다고 생각합니다. / var / lib / mysql 아래에 ddms 디렉토리를 복사 한 후 일부 테이블이 제대로 작동하면 .frm 파일, .MYD 파일 및 .MYI 파일과 같은 세 개의 파일 세트가있는 테이블입니다.

그러나 파일 집합이 다른 .frm 파일과 .ibd 파일의 두 테이블이 있습니다. 이 두 테이블은 phpMyAdmin의 테이블 목록에 나타나지 않았습니다. 오류 로그를 보면 다음과 같이 표시됩니다.

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

이 두 테이블을 복원하는 데 도움을주십시오. 감사.


Rolando의 4 월 23 일, 12 일의이 인용문은 오늘날에도 유효합니다. ``frm 및 .ibd 파일을 한 위치에서 다른 위치로 복사하면 문제가 발생합니다. ' mysqldump와 같은 대안을 사용하여 오래된 데이터를 몇 년 전에 계획대로로드 할 수있는 양식으로 가져옵니다. 백업이라고도합니다.
Wilson Hauck

답변:


35

InnoDB 테이블은 MyISAM 테이블과 같은 방식으로 복사 할 수 없습니다.

한 위치에서 다른 위치로 .frm 및 .ibd 파일을 복사하면 문제가 발생합니다. InnoDB 테이블의 .frm 및 .ibd 파일을 복사하는 것은 .ibd 파일의 테이블 스페이스 ID가 ibdata1 파일의 metdata에있는 테이블 스페이스 ID 항목과 정확히 일치 함을 보장 할 수있는 경우에만 적합합니다 .

이 테이블 스페이스 ID 개념에 대해 DBA StackExchange에 두 개의 게시물을 작성했습니다.

일치하지 않는 테이블 스페이스 ID가있는 경우 .ibd 파일을 ibdata1에 다시 첨부하는 방법에 대한 훌륭한 링크는 다음과 같습니다. http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . 이 내용을 읽은 후에는 .ibd 파일을 복사하는 것이 정말 미친 짓이라는 것을 즉시 깨달아야합니다.

Chris Calendar 링크의 제안을 적용하거나 mysql의 이전 설치로 돌아가서 mysql을 시작한 다음 mysql을 덤프 할 수 ddms있습니다. 그런 다음 해당 mysqldump를 새 mysql 인스턴스로 가져옵니다. 날 믿어. 훨씬 쉬울거야.


따라서 단일 테이블은 좋은 생각이 아니지만 당시의 전체 데이터베이스는 어떻습니까? 사용자 테이블이 손상되어 mysqld에서 --initialize를 수행해야했습니다. data_backup 폴더에서 전체 InoDB 데이터베이스 폴더를 복사 할 수 있습니까?
FMaz008

Rolando, 당신이 나를 도울 수있는 경우 : serverfault.com/q/908988/224334
Ionică Bizău

에 대한 귀하의 게시물은 How to Recover an InnoDB table whose files were moved around 말 그대로 내 생명을 구했습니다. 대단히 감사합니다.
Paulo Griiettner

20

최근에 같은 문제가 발생했습니다. RolandoMySQLDBA가 위에서 언급했듯이 테이블 스페이스 ID를 엉망으로 만들지 않고 해결하기 위해 사용한 단계는 다음과 같습니다. 나는 Mac에있어서 MAMP를 사용하여 데이터베이스를 MySQL 덤프로 내보낼 수있는 지점으로 복원했습니다.

여기에 대한 전체 블로그 게시물을 읽을 수 있습니다 : http://www.quora.com/Jordan-Ryan/Web-Dev/How-to-Recover-innoDB-MySQL-files-using-MAMP-on-a-Mac

당신은 가지고 있어야합니다 :

-ibdata1

-ib_logfile0

-ib_logfile1

mysql_database 폴더의 -.FRM 파일

당신이 기꺼이 파괴하려는 MAMP / MAMP Pro의 신선한 설치 (필요한 경우)

  1. 웹 서버에 SSH (dev, production, difference)를 찾아 mysql 폴더를 찾으십시오 (Linux에서 Plesk 설치를 위해 / var / lib / mysql에 있음)
  2. mysql 폴더를 압축
  3. MyISAM 또는 innoDB에 관계없이 모든 mySQL 데이터베이스를 포함해야하는 mysql 폴더의 아카이브를 다운로드하십시오 (필요한 경우이 파일을 scp하거나 다운로드 가능한 디렉토리로 이동).
  4. MAMP 설치 (Mac, Apache, MySQL, PHP)
  5. / Applications / MAMP / db / mysql /로 이동하십시오.
  6. / 응용 프로그램 / MAMP / db / mysql을 zip 아카이브로 백업
  7. 프로덕션 서버에서 mysql 폴더의 아카이브에 포함 된 모든 폴더와 파일에 복사하십시오 (필자의 경우 Plesk 환경).

    -/ 응용 프로그램 / MAMP / db / mysql / mysql /

    -/ 응용 프로그램 / MAMP / db / mysql / mysql_upgrade_info

    -/ 응용 프로그램 / MAMP / db / mysql / performance_schema

  8. 그리고 짜잔, 이제 phpMyAdmin에서 데이터베이스에 액세스 할 수 있어야합니다.

그러나 아직 완료되지 않았습니다. 이러한 파일을 프로덕션 환경으로 복원하려면 mysqldump를 수행해야하며 대규모 데이터베이스의 경우 phpmyadmin 인터페이스가 시간 초과됩니다. 다음 단계를 따르십시오.

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

참조를 위해 아래에 복사했습니다. 기본 MAMP 설치에서 비밀번호는 "root"입니다.

터미널을 사용하여 MAMP 용 mysqldump를 실행하는 방법

앰프에서 데이터베이스 내보내기 [1]

1 단계 : 새 터미널 창을 엽니 다

2 단계 : 터미널 cd / applications / MAMP / library / bin에 다음 행을 입력하여 MAMP 설치로 이동하십시오. Enter 키를 누르십시오.

3 단계 : 덤프 명령 작성 ./mysqldump -u [USERNAME] -p [DATA_BASENAME]> [PATH_TO_FILE] Enter 키를 누르십시오.

예:

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

빠른 팁 : 폴더를 빠르게 탐색하려면 폴더를 터미널 창으로 끌어서 폴더의 위치를 ​​씁니다. 누군가 나에게 이것을 보여준 좋은 날이었습니다.

4 단계 : Enter 키를 누른 후이 텍스트 행이 나타납니다. Enter enter password : 암호를 입력하고 글자가 나타나지 않는다는 점을 명심하십시오. 그러나 Enter 키를 누르십시오.

5 단계 : 파일을 저장 한 위치 확인 (있는 경우) 성공 이제 다음에 설명 할 데이터베이스를 가져올 수 있습니다.

이제 mysql 데이터베이스를 반출 했으므로 프로덕션 환경에서 반입 할 수 있습니다.


1
이 답변은 금입니다. 나에게 중요한 부분은 # 7이며, 파일은 절대적으로 보관 해야하는 파일입니다 (@jordan 덕분에 비슷한 솔루션에 대해서는 언급되지 않았습니다).
Bigood

@Bigood는 여전히 도움이되어 기쁘다!
jordan8037310

15

MySQL Utilites 및 MariaDB 10을 사용하여 MySQL 5.5 * .ibd 및 * .frm 파일을 복구했습니다.

1) SQL 생성 생성.
frm 파일에서 create sql을 얻을 수 있습니다. 당신은 사용해야합니다 https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqlfrm.html

쉘> mysqlfrm --server = 루트 : 패스 @ localhost를 : 3306 C : \ MY \ t1.frm - -port = 3310

다른 방법으로 SQL 작성을 할 수 있습니다.

2) 테이블
작성 데이터베이스에서 테이블을 작성하십시오.

3) alter table xxx ignore tablespace
* .ibd 파일을 바꾸려는 테이블을 버립니다.

4) * .ibd 파일 (MySQL 또는 MariaDB)을 MariaDB의 데이터 경로에 복사하십시오.
먼저 MySQL 5.5 및 5.6을 사용하여 복원하려고 시도하지만 데이터베이스가 충돌하고 테이블 공간 ID가 깨진 오류에 대해 즉시 중지됩니다. ( 오류 1030 (HY000) : 스토리지 엔진에서 오류 -1이 발생했습니다. )
MariaDB 10.1.8을 사용한 후 데이터를 성공적으로 복구했습니다.

5) alter table xxx import tablespace
이 명령문을 실행할 때 MariaDB는 파일에 대해 경고하지만 데이터를 복구하는 것보다 중요하지는 않습니다. :) 데이터베이스는 계속 진행되며 데이터를 볼 수 있습니다.

이 정보가 도움이 되길 바랍니다.


1
이것은 나를 위해 일했습니다. 비록 mysqlfrm(시도 버전 MySQLs 5.6 및 5.7와 1.3.5과 1.6.5) 올바른 포기하지 않았다 CREATE심지어 MySQL을 5.7 (사용하여 정의를, MySQL은 5.7.9에서 변경 기본 ROW_FORMAT을 결과) Schema mismatch (Expected FSP_SPACE_FLAGS=0x21, .ibd file contains 0x0.)테이블을 가져올 때. 명령문 ROW_FORMAT=compact끝에 수동으로 추가 CREATE하면 트릭이 발생했습니다.
Jānis Elmeris

@ JānisElmeris> Manually adding ROW_FORMAT=compact at the end of the CREATE statement did the trick.저에게도 효과가있었습니다. 감사! 👍
Synetech

3

파일을 백업으로 사용하는 것과 동일한 문제가 발생했습니다.

내가 해결 한 것은 데이터베이스 파일을 / var / lib / mysql / yourdb에 복사하고 ibdata1을 / var / lib / mysql에 배치하는 것입니다.

그런 다음 mysql -u root -p dbname 테이블에 액세스하고 이전에 손상된 테이블 중 일부에 쿼리 할 수 있는지 확인할 수있었습니다 .

나중에 mysqldump -u root -p [root_password] [database_name]> dumpfilename.sql을 사용하여 데이터베이스 덤프를 작성했습니다.


2

MAMP를 사용하고 있고 파일을 복사 한 후에 MySQL을 시작할 수없는 경우, innodb_force_recovery = 2내부에 넣은 my.ini다음 mysql을 실행하여 내 db를 내보내도록 할 수있었습니다.


1

* .ibd 파일을 원래 MySQL 서버로 복원 할 수 있으면 파일 액세스 권한도 복원하는 것을 잊지 마십시오. 필자의 경우 (CentOS7의 MySQL8) 파일을 /var/lib/mysql/db/tablename.ibd로 복원하고 다음을 실행했습니다.

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

액세스 권한을 수정하기 전에 테이블에 액세스하면 "2006 MySQL 서버가 사라졌습니다"라는 오류가 발생했습니다. 액세스 권한을 수정 한 후 테이블이 작동했습니다 (mysqld 서비스를 다시 시작하지 않아도).


0

비슷한 주제의 게시물을 수집했습니다 (여기에서 답변이 게시되지 않았습니다).

해결책 1 : https://dba.stackexchange.com/a/59978

해결책 2 : https://dba.stackexchange.com/a/71785 (+ 다른 게시물)

솔루션 3 : 테이블 복구 키트 : https://twindb.com/how-to-recover-innodb-dictionary/

솔루션 4 : ibd 파일에서 ibdata1없이 데이터 폴더에서 MySQL 데이터베이스 복구

해결 방법 5 : mysqlfrm명령 사용

솔루션 6 : https://dba.stackexchange.com/a/159001

솔루션 7 : https://dba.stackexchange.com/a/144573


이것은 의심의 여지없이 링크 전용 답변처럼 보입니다.
mustaccio

모든 링크는 자체 사이트에서 제공되므로 사라지지 않을 것이므로 @mustaccio
jcolebrand

3
대부분의 값이 "관련"목록에 오른쪽에 몇 픽셀 표시되어 있기 때문에 이것은 많은 가치를 부가하지 않는 것 같습니다.
mustaccio

@jcolebrand 가벼운 생각에 감사드립니다. 많은 사람들이 그러한 "직접적이지 않은"답변의 유용성조차 볼 수 없습니다. 규칙 위반 만 감지 할 수 있습니다.
T.Todua

1
하지만 당신은 그가 옳다는 것을 이해해야합니다. 값을 추가하지 않았습니다. 나는 당신의 대답을 용서하지 않고 규칙 판결로 응답했습니다. 실제로는 꽤 나쁜 대답입니다.
jcolebrand

0

macos El Capitan 사용자를 위해 하나 더 추가하고 싶습니다. 이 버전에서는 MySQL 유틸리티가 지원되지 않으므로 mysqlfrm 명령은 도움이되지 않습니다. 내가 한 것은이 링크에 표시된 것처럼 dbsake로 테이블 구조를 복구하는 것입니다 : https://www.percona.com/blog/2015/12/16/recovering-table-structure-from-frm-files-using-dbsake/

dbsake를 설치하기 만하면됩니다.

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

frmdump 명령을 사용하여 .frm 파일의 경로를 제공하십시오.

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

당신은 create 문을 얻을 것이다. 이 작업을 마치면 @Ecd에서 이미 언급 한 2 ~ 5 단계를 따르기 만하면됩니다. 그것이 누군가를 돕기를 바랍니다.


0

정말 Ecd 감사합니다. 나를 위해 일한 것 :

1.- 몇 달 전에베이스 백업을 했으므로 Windows 10의 xampp 에서이 백업을 들어 올리고 구조를 갖도록 테이블을 만드는 데 도움이되었습니다 (구성 : Windows 10, xampp-windows-x64-7.1.30- 5-VC14) 마지막에 mysql my.ini 구성 파일

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.- 오래된 데이터베이스를 사용하면서 복구하려는 데이터베이스의 각 테이블에 대해 alter table xxx destroy tablespace를 실행 한 다음 C에있는 데이터 폴더의 .ibd 파일을 실행했습니다. / xampp / mysql / data / system 삭제되었습니다 (이 경우에는이 경로입니다)

3.- 복구하려는 데이터베이스에서 .ibd 파일을 이전 데이터베이스의 xampp 폴더로 복사했습니다.

4 .- 복사, 실행 파일을 갖는 데이터베이스의 각 테이블에 대해 ALTER 테이블 XXX 가져 오기 테이블 스페이스를 경고가 나타납니다하지만 우리는 그것을 무시하고, 데이터가 테이블에로드됩니다 나중에 내보낼 수 있습니다.

5.- 전체 데이터베이스를 sql 파일로 내보내고 생산 및 성공으로 구축하십시오!

# 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

이 상황이있는 사람에게 도움이되기를 바랍니다.

Google에서 제공하는 영어


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.