web-dev-qa-db-ja.com

.frmおよび.ibdファイルからテーブルを復元しますか?

以前に/ var/lib/mysql/ddmsディレクトリのコピーを保存しました(「ddms」はスキーマ名です)。新しくインストールしたUbuntu 10.04.3 LTSにapt-get install mysql-serverを実行して新しいMySQLをインストールしました。バージョン5.1がインストールされたと思います。/var/lib/mysqlの下にddmsディレクトリをコピーした後、そのテーブルの一部は正常に機能します。これらは、関連する3つのファイルのセット(.frmファイル、.MYDファイル、.MYIファイル)を持つテーブルです。

ただし、ファイルのセットが異なる2つのテーブル(.frmファイルと.ibdファイル)があります。これら2つのテーブルは、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.

これら2つのテーブルの復元を手伝ってください。ありがとう。

38
Tong Wang

InnoDBテーブルは、MyISAMテーブルと同じ方法でコピーすることはできません。

.frmファイルと.ibdファイルをある場所から別の場所にコピーするだけでは問題が発生します。 InnoDBテーブルの.frmおよび.ibdファイルをコピーすることは、.ibdファイルのテーブルスペースIDがibdata1ファイルのmetdataのテーブルスペースIDエントリ。

このテーブルスペースIDの概念について、DBA StackExchangeで2つの投稿を書きました

テーブルスペースIDが一致しない場合に.ibdファイルをibdata1に再アタッチする方法に関する優れたリンクを次に示します。 http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file 。これを読んだ後は、.ibdファイルのコピーは非常に簡単であることにすぐに気付くはずです。

Chris Calendarリンクからの提案を適用するか、mysqlの古いインストールに戻ってmysqlを起動し、次にddmsデータベースをmysqldumpすることができます。次に、そのmysqldumpを新しいmysqlインスタンスにインポートします。私を信じて、これははるかに簡単でしょう。

38
RolandoMySQLDBA

最近、同じ問題が発生しました。 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. WebサーバーにSSH接続し(dev、製品版、違いなし)、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. / Applications/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を実行する方法

MAMP [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キーを押してください

ステップ5:ファイルを保存した場所を確認します。ファイルがそこにある場合は、成功します。これで、次に概説するデータベースをインポートできます。

Mysqlデータベースのエクスポートが完了したので、それを本番環境にインポートできます。

20
jordan8037310

MySQL UtilitesとMariaDB 10を使用して、MySQL 5.5の* .ibdファイルと* .frmファイルを復元しました。

1)Create SQLの生成
frmファイルから作成SQLを取得できます。使用する必要があります: https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqlfrm.html

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

SQLを作成する他の方法。

2)テーブルを作成します
データベースにテーブルを作成します。

3)alter table xxx discard tablespace
*。ibdファイルを置き換えるテーブルを破棄します。

4)* .ibdファイル(MySQLまたはMariaDB)をMariaDBのデータパスにコピーします
最初にMySQL 5.5および5.6を使用して再起動しようとしましたが、データベースがクラッシュし、テーブルスペースIDの破損エラーについてすぐに停止します。 (ERROR 1030(HY000):Got error -1 from storage engine
MariaDB 10.1.8を使用した後、データを正常に回復しました。

5)alter table xxx import tablespace
このステートメントを実行すると、MariaDBはファイルについて警告しますが、データを回復することほど重要ではありません:)データベースは引き続き続行され、データを表示できます。

この情報がお役に立てば幸いです。

15
Ecd

ファイルをバックアップとして使用するだけでまったく同じ問題が発生しました。

私がそれを解決するためにしたことは、データベースファイルを/ var/lib/mysql/yourdbと/ var/lib/mysqlに配置されているibdata1にコピーすることでした。

次に、テーブルにアクセスできることを確認できましたmysql -u root -p dbnameと、以前に破損したテーブルの一部にクエリを実行しました。

後でデータベースのダンプを作成しましたmysqldump -u root -p [root_password] [database_name]> dumpfilename.sql

3
Tue

MAMPを使用していて、ファイルをコピーした後にMySQLを起動できない場合は、innodb_force_recovery = 2内部my.iniその後、mysqlを起動して自分のデータベースをエクスポートすることができました。

2
Peter Wakeman

* .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サービスを再起動しなくても)。

1
Samuraj

Macos El Capitanユーザー向けにもう1つ追加したいと思います。 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
user2804064

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 discard tablespaceを実行し、次にCのデータフォルダーの.ibdファイルを実行しました。 xampp/mysql/data/systemは削除されました(この場合は、このパスです)

.-回復したいデータベースから古いデータベースのxamppフォルダーに.ibdファイルをコピーしました

4 .-ファイルをコピーして実行します。altertable xxx import tablespaceデータベース内のテーブルごとに警告が表示されますが、無視します。データはテーブルにロードされ、後でエクスポートされます。

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が提供する英語

0
Yersskit

同様のトピックから投稿を収集しました(ここに回答が投稿されなかった人):

ソリューション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/14457

0
T.Todua