SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.03.2010 18:55:58

albedo
Участник
Зарегистрирован: 26.03.2010
Сообщений: 4

Восстановление данных для Innodb таблиц

Здравствуйте,

Попал в неприятную ситуацию...
Дано:
Есть набор файлов *.frm и *.ibd .
Есть SQL дамп этой базы данных с правильной структурой таблиц, но устаревшими данными.
Больше к сожалению ничего, это все что удалось забрать у хостера..

Каким образом можно восстановить базу данных из файлов?
Заранее благодарю за помощь.

Отредактированно albedo (26.03.2010 19:04:57)

Неактивен

 

#2 26.03.2010 19:55:15

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Восстановление данных для Innodb таблиц

ibdata* и iblog* попросите у хостера тоже, иначе прийдется только устаревшие
данные восстанавливать.

UPD: мне тут rgbeast говорит, что ibdata* достаточно. И правда — достаточно smile

Неактивен

 

#3 26.03.2010 20:10:59

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Восстановление данных для Innodb таблиц

Попробуйте создать такие же innodb-таблицы, а потом заменить frm и idb-файлы, как описано здесь

http://forums.innodb.com/read.php?4,164,165#msg-165

Сложность в том, что таблицы должны создаваться в том же порядке, как они создавались раньше, чтобы иметь тот же внутренний id. Это можно сделать перебором. Создать одну таблицу, посмотреть будет ли работать, если будет - значит у нее id=1. Так можно все перебрать. Если это стандартный форум, то порядок создания известен - поставьте нулевой вариант, а потом замените все файлы. Непростое дело, но удачи Вам!

Неактивен

 

#4 26.03.2010 20:53:57

albedo
Участник
Зарегистрирован: 26.03.2010
Сообщений: 4

Re: Восстановление данных для Innodb таблиц

Файл ibdata боюсь мне не отдадут, но я попробую.
Последний совет отличный. Эти данные - БД Битрикса, так что порядок создания можно узнать.
Правда в базе были таблицы myisam которые не относились к Битрикс, я так понимаю - нумерация единая независимо от типа хранилища? Сейчас скопировал в новую бд одну таблицу myisam (первую по алфавиту). С ней все нормально естественно.
Мне нужно создать все таблицы включая myisam в правильном порядке?

Отредактированно albedo (26.03.2010 20:54:40)

Неактивен

 

#5 26.03.2010 20:59:11

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Восстановление данных для Innodb таблиц

Я думаю, что MyISAM-таблицы не при чем. У Innodb своя нумерация.

Есть еще совсем жестокий метод восстановления с помощью innodb tools разбиваете файлы на 16кб страницы, а потом из них вынимаете данные. У кого-то даже получилось: http://www.chriscalender.com/?p=49

Неактивен

 

#6 26.03.2010 21:32:40

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Восстановление данных для Innodb таблиц

Поупражнялся. Пусть вы знаете первую Innodb-таблицу dobro, пусть база называется z. Пусть есть чистый сервер с опцией innodb_file_per_table

Все действия делаете в /var/lib/mysql/

1. service mysql stop
2. rm ib* z/*.frm z/*.ibd
3. service mysql start
4. mysql> CREATE DATABASE `z` CHARSET=cp1251; (нужно ровно такое же определение, как было)
5. mysql> CREATE TABLE `z`.`dobro` (точное описание таблицы) ENGINE=Innodb;
(если не знаете точного описания таблицы, то его можно узнать отдельно: создать произвольную таблицу, заменить frm-файл, SHOW CREATE TABLE)
6. service mysql stop
7. cp /my/backup/dobro.frm z/
8. cp /my/backup/dobro.ibd z/
9. service mysql start
10. mysql> SELECT * FROM `z`.`dobro`;

Если получилось, то отлично, если данных нет, то попробуйте
11. mysql> ALTER TABLE `z`.`dobro` ENGINE=Innodb;

Затем восстанавливаете вторую таблицу. Если Вы не знаете номер таблицы, то действуйте перебором - перед пунктом 5 создайте N таблиц innodb, CREATE TABLE `z`.`x1` (x int) ENGINE=Innodb;
Лучше другой перебор - сначала среди всех таблиц найти первую, затем вторую и.т.д. Если не получилось, то mysql упадет при SELECT, выбирайте другую таблицу и повтроряйте всю процедуру сначала (остановка сервера, очистка)

Неактивен

 

#7 26.03.2010 22:04:18

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Восстановление данных для Innodb таблиц

Есть способ проще от Зайцева. Смотри его доклад: http://www.technocation.org/content/vid … techniques
(где-то от 24 минуты).

1. service mysql start
2. mysql> CREATE TABLE `z`.`dobro` (точное описание таблицы) ENGINE=Innodb;
3. ALTER TABLE `z`.`dobro` discard tablespace;
он удалит .ibd-файл
4. Скопировать свой ibd-файл (убедитесь, что владелец нового файла mysql, chown mysql.mysql z/dobro.ibd )
5. ALTER TABLE `z`.`dobro` import tablespace;
если эта команда сработает, то перейти к пункту 6
если будет ошибка, то надо смотреть в лог что за ошибка. Если это несовпадение номера tablespace, то см. доклад Зайцева 25:59, он предлагает с помощью hex-редактора изменить номер tablespace в бинарном файле в позициях 0x25 и 0x29 и повторить пункт 5.
6. ALTER TABLE `z`.`dobro` ENGINE=INNODB

Неактивен

 

#8 27.03.2010 01:23:34

albedo
Участник
Зарегистрирован: 26.03.2010
Сообщений: 4

Re: Восстановление данных для Innodb таблиц

Все попробовал. Огромное спасибо за помощь.
Действительно номер tablespace правится в hex редакторе, правда у меня он встречается чаще - 6-7 раз во взятой на угад таблице.

Таким образом я смог воостановить только что созданную таблицу, а вот старую к сожаению нет. После команды import tablespace происходит баг
http://bugs.mysql.com/bug.php?id=38901
и лог переполняется. У меня ubuntu + mysql 5.1. Диск запоняется с дикой скоростью. Думаю что способ рабочий, но нужно хорошо знать структуру ibd файлов на низком уровне и явно править что-то еще.

Последнее, что я получил это ошибку

Mar 27 01:04:31 albedo mysqld: 100327  1:04:30  InnoDB: Error: trying to access tablespace 1 page no. 3,
Mar 27 01:04:31 albedo mysqld: InnoDB: but the tablespace does not exist or is just being dropped.

в бесконечно цикле. Мне ошибка непонятна тк моя старая таблица больше пустой новой. Почему происходит попытка обращения к page no. 3 которой видимо нет в старой таблице? Таблица маленькая. Где вообще храниться индекс tablespace? Наприме может где-то есть число страниц и его также можно приветси в соответствие с заменяемой таблицей.

Отредактированно albedo (27.03.2010 01:24:46)

Неактивен

 

#9 27.03.2010 09:48:46

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Восстановление данных для Innodb таблиц

Попробуйте поставить ту же версию MySQL, что была на хостинге (я думаю, что это не 5.1). Проверьте кодировку и точно ли такая же таблица создана, как была. Если возникает ошибка, то можно попробовать перезапустить с innodb_force_recovery=6, тогда он не на все ошибки будет падать (но это скорее всего не поможет получить данные). Индекс tablespace должен храниться в ibdata.

innodb tools должны помочь извлечь данные, там несколько непрозрачный алгоритм, зато топорный - он восстанавливает данные по отдельным страницам.

Неактивен

 

#10 02.04.2010 17:31:54

albedo
Участник
Зарегистрирован: 26.03.2010
Сообщений: 4

Re: Восстановление данных для Innodb таблиц

Добрый день,

Вообщем с помощью innodb tools я восстановил часть данных. Большое спасибо за оперативную помощь.
Есть ли где-тов сети описание innodb engine с точки зрения структуры файлов, алгоритма записи и хранения инфомации? Чтобы знать на будущее?

Неактивен

 

#11 02.04.2010 17:38:22

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Восстановление данных для Innodb таблиц

Вот здесь частично описано: http://forge.mysql.com/wiki/InnoDB_Inte … _Structure
Полный формат наверное нужно смотреть в исходниках.

Неактивен

 

#12 24.05.2011 18:45:04

softsoft
Участник
Зарегистрирован: 24.05.2011
Сообщений: 2

Re: Восстановление данных для Innodb таблиц

Привет,
вот пришлось воспользоватся innodb-tools.
и всё вышло... как раз востанавливал из *.frm + *.ibd

выглядит это так:
1. Cкачать и скомпилировать innodb-tools в рабочую папку.
2. остановить базу, и скопировать файлы : *.ibd, скажем в папку ./db/
3. создать ( можно пустую ) структуру таблиц ( очень рекомендуется 100% порядок полей )
4. далее шаги применять к каждому *.ibd файлу по отдельности:
4.1. ./create_defs.pl --host=172.16.205.132 --user=dbuser --password=password --db=dbname --table=dbtable > include/table_defs.h
4.2. пересобрать скрипты: make
4.3. запустить парсер: ./page_parser -5 -f ./db/dbtable.ibd
4.4. протестировать: ./constraints_parser -5 -f ./pages-1306247264/0-93/4-00000004.page
4.5.1. еслти проблемы, поправить файл: include/table_defs.h, и перейти к п. 4.2.
4.5.2. еслти нет проблем, склеить страницы: find ./pages-1306244252/0-121/ -type f -name '*.page' | sort -n | xargs cat > ./pages-1306244252/dbtable_allpages
4.6. перегнать файл страниц в простой дамп: ./constraints_parser -5 -f ./pages-1306244252/dbtable_allpages > ./pages-1306244252/dbtables.tsv
4.7. убрать если надо - пустые и дубль записи, любым редактором, не портящим структуру.
4.8. ну и импортировать данные в базу данных:

LOAD DATA INFILE '/tmp/customer_data.tsv'
REPLACE INTO TABLE customer
FIELDS TERMINATED BY '\t'
OPTIONALLY ENCLOSED BY '"'
LINES STARTING BY 'customer\t'
(customer_id, store_id, first_name, last_name, email,
   address_id, active, create_date, @last_update)
SET last_update = FROM_UNIXTIME(@last_update);
 


вот собственно и всё.
smile
Надеюсь кому пригодиться.

Неактивен

 

#13 25.05.2011 16:45:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Восстановление данных для Innodb таблиц

Ого, классно. А много удалось восстановить?

Неактивен

 

#14 05.06.2011 13:25:14

softsoft
Участник
Зарегистрирован: 24.05.2011
Сообщений: 2

Re: Восстановление данных для Innodb таблиц

как это ни странно - всё востановил.
единственно сделаю примечание:
пробовал с : MySql 5.1, MariaDB 5.1/5.2 и Percona DB 5.5
работает метод с : InnoDB и XtraDB

Удачи всем! И почаще делайте бекапы smile

Отредактированно softsoft (05.06.2011 13:26:24)

Неактивен

 

#15 24.04.2012 21:28:53

XJIOP
Участник
Зарегистрирован: 28.02.2009
Сообщений: 22

Re: Восстановление данных для Innodb таблиц

два дня мучился с утилитой innodb-tools. на парсерах выдавало ошибки.

помогло это описание http://www.chriscalender.com/?p=28 там два способа, но во втором не получилось через HEX редактор найти и поправить id таблиц.
а первый простой, главное иметь структуру таблиц, кстати я ее тоже похерил, еле восстановил из frm файлов.

Отредактированно XJIOP (24.04.2012 21:30:02)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson