відновити таблицю з .frm та .ibd файлів?


36

Раніше я зберегла копію каталогу / var / lib / mysql / ddms ("ddms" - це ім'я схеми). Тепер я встановив новий MySQL на щойно встановленому Ubuntu 10.04.3 LTS шляхом запуску apt-get install mysql-server, я вважаю, що версія 5.1 була встановлена. Після того як я скопіюю каталог ddms в / var / lib / mysql, деякі його таблиці працюють нормально, це таблиці з пов'язаним набором з трьох файлів: .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.

Будь ласка, допоможіть відновити ці дві таблиці. Спасибі.


Ця цитата Роландо від 23 квітня 12 року діє і сьогодні. "Просто копіювання файлів .frm та .ibd з одного місця в інше викликає проблеми." Використовуйте таку альтернативу, як mysqldump, щоб перенести старі дані у форму, яку можна завантажити, як планувалося років тому. Також відомий як резервне копіювання.
Вілсон Хоук

Відповіді:


37

Таблиці InnoDB не можуть бути скопійовані так, як можуть використовувати таблиці MyISAM.

Просто копіювання файлів .frm та .ibd з одного місця в інше викликає проблеми. Копіювання файлів .frm та .ibd таблиці InnoDB добре лише тоді і лише тоді, коли ви можете гарантувати, що ідентифікатор простору таблиць .ibd-файлу точно збігається із записом ідентифікатора просторової таблиці в метаданих файлу ibdata1 .

Я написав два повідомлення в DBA StackExchange про цю концепцію ідентифікації простору таблиць

Ось чудове посилання про те, як повторно прив’язати будь-який .ibd файл до ibdata1 у разі невідповідності ідентифікаторів простору таблиць: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Прочитавши це, вам слід прийти до негайного усвідомлення того, що копіювання файлів .ibd просто божевільне.

Ви можете застосувати пропозиції за посиланням Chris Calendar або ви можете повернутися до старої установки mysql, запустити mysql, а потім mysqldump ddmsбазу даних. Потім імпортуйте цей mysqldump у ваш новий екземпляр mysql. Повірте, це було б набагато простіше.


Отож, одна таблиця може бути не гарною ідеєю, але як бути з цілою базою даних на той час? У мене погано вийшов таблиця користувачів, і мені довелося зробити - ініціалізувати на mysqld. Чи можу я скопіювати всю папку баз даних InoDB з папки data_backup?
FMaz008

Роландо, про всяк випадок, якщо ви можете мені допомогти: serverfault.com/q/908988/224334
Ionică Bizău

Твій пост How to Recover an InnoDB table whose files were moved around буквально врятував мені життя. Велике спасибі.
Пауло Гріеттнер

20

Я нещодавно пережив це саме питання. Ось кроки, якими я скористався для її вирішення, без того, щоб возитися з ідентифікатором простору таблиць, як згадується вище RolandoMySQLDBA. Я на 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

-.FRM файли з вашої папки mysql_database

-Сперша установка MAMP / MAMP Pro, яку ви готові знищити (за потреби)

  1. SSH на ваш веб-сервер (dev, виробництво, немає різниці) та перейдіть до своєї папки mysql (моя була в / var / lib / mysql для встановлення системи Plesk в Linux)
  2. Стисніть папку mysql
  3. Завантажте архів папки mysql, яка повинна містити всі бази даних mySQL, будь то MyISAM чи innoDB (ви можете скопіювати цей файл або перемістити його до завантажуваного каталогу, якщо потрібно)
  4. Встановити MAMP (Mac, Apache, MySQL, PHP)
  5. Переглянути до / Програми / MAMP / db / mysql /
  6. Резервне копіювання / Програми / MAMP / db / mysql в zip архіві (на всякий випадок)
  7. Скопіюйте у всі папки та файли, що входять до архіву папки mysql, з виробничого сервера (середовище mt 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".

Як запустити mysqldump для MAMP за допомогою терміналу

ЕКСПОРТНІ ДАНИНИ З МАМПИ [1]

Крок перший: Відкрийте нове вікно терміналу

Крок другий: Перейдіть до встановлення MAMP, ввівши наступний рядок у терміналі cd / applications / MAMP / library / bin. Натисніть клавішу введення

Крок третій: Напишіть команду dump ./mysqldump -u [USERNAME] -p [DATA_BASENAME]> [PATH_TO_FILE] Натисніть клавішу введення

Приклад:

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

Коротка порада: для швидкого переходу до папки ви можете перетягнути папку у вікно терміналу, і вона запише розташування папки. Це був прекрасний день, коли хтось мені це показав.

Крок четвертий: Цей рядок тексту повинен з’являтися після натискання клавіші Введення пароля: Тож здогадайтесь, що, введіть свій пароль, майте на увазі, що літери не з’являться, але вони є. Натисніть клавішу введення

Крок п'ятий: Перевірте місце, де ви зберегли свій файл, якщо він там є, SUCCESS Тепер ви можете імпортувати базу даних, яка буде окреслена далі.

Тепер, коли у вас є експорт вашої бази даних mysql, ви можете імпортувати її у виробниче середовище.


1
Досі працює з 2018 року. Ця відповідь - золота. Для мене важливою частиною є №7, це файли, які ви абсолютно повинні зберегти (про подібні рішення ніде більше не згадується, дякую за це @jordan).
Бігуд

@Bigood радий, що це все ще допомагає!
jordan8037310

отримання таблиці помилок 1146 не існує при виконанні дамп
Роберт Сінклер

15

Я відновив свої файли MySQL 5.5 * .ibd та * .frm за допомогою MySQL Utilites та MariaDB 10.

1) Генерування створення SQL.
Ви можете отримати sql з файлу frm. Ви повинні використовувати: 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

Інший спосіб, коли ви можете створити sql.

2) Створіть свої таблиці
Створіть таблиці в базі даних.

3) змінити таблицю xxx відкинути простір таблиць
Відкиньте свої таблиці, які ви хочете замінити * .ibd файлами.

4) Скопіюйте свої файли *
. ( ПОМИЛКА 1030 (HY000): Отримана помилка -1 від двигуна зберігання )
Після того, як я використав MariaDB 10.1.8, і я успішно відновив свої дані.

5) змінити таблицю імпорту таблиць xxx імпорту
При запуску цього оператора MariaDB попереджає про файл, але це не важливо, ніж відновити ваші дані :) База даних все ще продовжується, і ви можете побачити ваші дані.

Сподіваюся, ця інформація буде корисною для вас.


1
Це працювало для мене. Хоча mysqlfrm(випробувані версії 1.3.5 та 1.6.5 з MySQLs 5.6 та 5.7) не давали правильного CREATEвизначення, навіть при використанні MySQL 5.7 ( типовий ROW_FORMAT змінено у MySQL 5.7.9 ), що призводить до Schema mismatch (Expected FSP_SPACE_FLAGS=0x21, .ibd file contains 0x0.)імпорту табличного простору. Ручне додавання ROW_FORMAT=compactв кінці CREATEзаяви зробило трюк.
Яніс Елмеріс

@ 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] [ ім'я бази даних]> dumpfilename.sql


2

Якщо ви використовуєте MAMP і ви не можете запустити MySQL після запуску копіювання файлів, я поклав innodb_force_recovery = 2всередину, my.iniі тоді мені вдалося отримати mysql для запуску та експорту мого db.


1

Якщо ви зможете відновити файл * .ibd на оригінальному сервері MySQL, не забудьте відновити права доступу до файлу. У моєму випадку (MySQL8 на CentOS7) я відновив файл у /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: Відновлення бази даних MySQL з папки даних без ibdata1 з файлів ibd

рішення 5: за допомогою mysqlfrmкоманди

рішення 6: https://dba.stackexchange.com/a/159001

рішення 7: https://dba.stackexchange.com/a/144573


Це підозріло виглядає як відповідь лише на посилання.
mustaccio

Оскільки всі посилання з нашого власного сайту, вони, ймовірно, не зникають, тому я добре з цим @mustaccio
jcolebrand

3
Це, мабуть, не додає великої цінності, оскільки більшість із них також відображається у списку "Пов'язані" декількома пікселями праворуч.
мустаччо

@jcolebrand дякує за те, що задумався. багато людей не бачать корисності навіть таких "непрямих" відповідей. Вони можуть виявити лише порушення правил.
Т.Тодуа

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. Після того, як я це зробив, я просто дотримувався кроків 2 - 5, які вже згадував @Ecd. Сподіваюся, це комусь допоможе.


0

Я дуже ціную Ecd. Що для мене спрацювало:

1.- У мене була резервна копія бази кілька місяців тому, це допомогло мені підняти цю резервну копію в xampp в Windows 10 та створити таблиці, щоб мати структуру (конфігурація: 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 відкинути простір таблиць для кожної таблиці в базі даних, яку я хотів відновити, а потім .ibd файли папки даних у C: / xampp / mysql / data / system було видалено (у даному випадку це шлях)

3.- Я перейшов до копіювання файлів .ibd із бази даних, яку хотів відновити у папку xampp старої бази даних

4.- Після копіювання файлів запустіть: alter table 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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.