Среда: MySQL 8.0.
Случайно удалил каталог данных MySQL, Но все жеОстался один файл .ibdсуществовать. Резервное копирование не требуется, Нет бинлога , Чтобы восстановить данные в этом файле ibd.
ах. этот..... Сначала избили администратора базы данных, который не сделал резервную копию
Обычно мы используемРезервное копирование+бинлогПриходить Восстановить данные, Но на этот раз существует только один файл ibd.
мы знаем MySQL 8.0 Файл ibd также содержит информацию о метаданных (откуда я это знаю,спросите вы?). Итак, мы сначала Восстановить структуру таблицы,Снова Восстановить данные.
Будет лучше, если в разработке будет соответствующий DDL. Если нет — разберем сами.
В файле ibd mysql 8.0 есть страница sdi, которая записывает информацию метаданных в сжатом формате json. Мы можем использовать официальный ibd2sdi для анализа этой информации json.
ibd2sdi /data/mysql_3314/mysqldata/ibd2sql/ddcw_alltype_table.ibd
Но склеить DDL самостоятельно слишком хлопотно.
Поэтому мы используем другие инструменты для извлечения DDL, Используйте это здесь ibd2sql извлечь (зачем использовать это? Потому что я это написал -_- Легко использовать)
python3 main.py /tmp/ddcw_alltype_table.ibd --ddl
Теперь DDL извлечен. Сначала мы создаем тестовую среду, создаем ту же библиотеку, а затем используем приведенный выше DDL для восстановления соответствующей структуры таблицы.
CREATE TABLE IF NOT EXISTS `ibd2sql`.`ddcw_alltype_table`(
`id` int NOT NULL AUTO_INCREMENT,
`int_col` int NULL,
`tinyint_col` tinyint NULL DEFAULT '1',
`smallint_col` smallint NULL,
`mediumint_col` mediumint NULL,
`bigint_col` bigint NULL,
`float_col` float NULL,
`double_col` double NULL,
`decimal_col` decimal(10,2) NULL,
`date_col` date NULL,
`datetime_col` datetime NULL,
`timestamp_col` timestamp NULL,
`time_col` time NULL,
`year_col` year NULL,
`char_col` char(100) NULL,
`varchar_col` varchar(200) NULL DEFAULT 'aa',
`binary_col` binary(10) NULL,
`varbinary_col` varbinary(20) NULL,
`bit_col` bit(4) NULL,
`enum_col` enum('A','B','C') NULL,
`set_col` set('X','Y','Z') NULL,
`josn_type` json NULL,
`newcol` varchar(200) NULL DEFAULT 'aa',
`newcol2` varchar(200) NULL DEFAULT 'aa',
`newcoldasdas2` varchar(300) NULL DEFAULT 'bbaa',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ;
После восстановления структуры таблицы Должно Восстановить данные Понятно.
MySQL может использовать сброс table для удаления табличного пространства, Затем используйте импорт tablespace для импорта табличного пространства. Вот как мы его используем данные.
Официальный сайт: введение: https://dev.mysql.com/doc/refman/8.0/en/innodb-table-import.html
-- Удалить табличное пространство
alter table ddcw_alltype_table discard tablespace;
-- Скопируйте табличное пространство, которое нужно восстановить.
system cp -ra /tmp/ddcw_alltype_table.ibd /data/mysql_3314/mysqldata/ibd2sql
-- Импортируйте табличное пространство, которое нужно восстановить.
alter table ddcw_alltype_table import tablespace;
-- Проверка данных
select count(*) from ddcw_alltype_table;
Этот метод очень прост и удобен, поэтому рекомендуется.
Но можно потерпеть неудачу (жизнь не всегда легка)
Если табличное пространство невозможно импортировать, Мы также можем проанализировать этот файл ibd, чтобы получить соответствующие данные. На рынке мало таких инструментов Я все еще использую его здесь ibd2sql (Частные товары включены-_-)
Страницы переполнения в настоящее время не поддерживаются (по умолчанию NULL). Также не рекомендуется хранить большие данные в MySQL.
В основном поддерживаются все типы данных, но не поддерживаются поля пространственных координат (почему? Потому что это слишком сложно и какое-то время не будет анализироваться...)
python3 main.py /tmp/ddcw_alltype_table.ibd --sql > /tmp/ddcw_alltype_table.sql
Затем мы можем импортировать разобранный sql в базу данных. Конечно, мы также можем записать его напрямую в базу данных через конвейер во время разбора.
mysql -h127.0.0.1 -P3314 -p123456 < /tmp/ddcw_alltype_table.sql
Хотяостался только одинibdдокумент Также Но Восстановить данные, Но вам все равно нужно сделать резервную копию. Ведь эти инструменты могут не сработать. (У большинства есть резервные копии, Есть несколько примеров использования этих инструментов. Диапазон поддержки небольшой)
Если при использовании инструмента ibd2sql возникли проблемы, пожалуйста, придиgithubУпоминание актуальногоissue, Прикреплены версия ibd2sql и версия mysql, Лучше всего прикрепить лог отладки.
Адрес загрузки здесь не указан. Последняя версия не упакована. Чтобы использовать ее, необходимо загрузить исходный код (написан на python3, без пакетов зависимостей, просто используйте его напрямую).
Прилагается использование ibd2sql:
14:20:37 [root@ddcw21 ibd2sql_v1.1]#python3 main.py --help
usage: main.py [-h] [--version] [--ddl] [--sql] [--delete] [--complete-insert] [--force] [--set] [--multi-value] [--replace]
[--table TABLE_NAME] [--schema SCHEMA_NAME] [--sdi-table SDI_TABLE] [--where-trx WHERE_TRX]
[--where-rollptr WHERE_ROLLPTR] [--where WHERE] [--limit LIMIT] [--debug] [--debug-file DEBUG_FILE]
[--page-min PAGE_MIN] [--page-max PAGE_MAX] [--page-start PAGE_START] [--page-count PAGE_COUNT]
[--page-skip PAGE_SKIP] [--parallel PARALLEL]
[FILENAME]
Разбор ibd-документа MySQL 8.0 https://github.com/ddcw/ibd2sql
positional arguments:
FILENAME ibd filename
options:
-h, --help show this help message and exit
--version, -v, -V show version
--ddl, -d print ddl
--sql print data by sql
--delete print data only for flag of deleted
--complete-insert use complete insert statements for sql
--force, -f force pasrser file when Error Page
--set set/enum to fill in actual data instead of strings
--multi-value single sql if data belong to one page
--replace "REPLACE INTO" replace to "INSERT INTO" (default)
--table TABLE_NAME replace table name except ddl
--schema SCHEMA_NAME replace table name except ddl
--sdi-table SDI_TABLE
read SDI PAGE from this file(ibd)(partition table)
--where-trx WHERE_TRX
default (0,281474976710656)
--where-rollptr WHERE_ROLLPTR
default (0,72057594037927936)
--where WHERE filter data(TODO)
--limit LIMIT limit rows
--debug, -D will DEBUG (it's too big)
--debug-file DEBUG_FILE
default sys.stdout if DEBUG
--page-min PAGE_MIN if PAGE NO less than it, will break
--page-max PAGE_MAX if PAGE NO great than it, will break
--page-start PAGE_START
INDEX PAGE START NO
--page-count PAGE_COUNT
page count NO
--page-skip PAGE_SKIP
skip some pages when start parse index page
--parallel PARALLEL, -p PARALLEL
parse to data/sql with N threads.(default 4) TODO