![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Как сократить размер ibdata1 после удаления записей в таблицах?
P.S. на MS SQL сервере есть schrink database.. а как сделать аналогично на MySQL
Неактивен
Такой возможности, к сожалению, нет. Только путем пересоздания этого файла (таблицы либо восстановить из дампа, либо временно перенести в myisam).
Неактивен
А если поменять my.cnf, указав меньший размер, и перезапустить сервер?
Неактивен
rgbeast написал:
либо временно перенести в myisam.
т.е. сменить тип базы данных на myisam? приведите пожалуйста код как это сделать?
Неактивен
ALTER TABLE tablename ENGINE=MyISAM
В будущем, если включите innodb_file_per_table, сможете уменьшать объем tablespace путем
пересоздания таблиц сразу в InnoDB (т.к. в режиме файл-на-таблицу файл при удалении таблицы
стирается) командой ALTER TABLE tablename ENGINE=InnoDB
Неактивен
LazY написал:
А если поменять my.cnf, указав меньший размер, и перезапустить сервер?
будет ошибка innodb
Неактивен
Не понял. Почему, если таблицы пустые, нельзя написать
[syntax=shellinnodb_data_file_path=ibdata1:X;ibdata2:XM:autoextend[/syntax]
где X меньше текущего?
Неактивен
Написать можно, но только работать так не будет. Попробуй.
Неактивен
Нельзя, т.к. таблицы (даже пустые) могут располагаться в произвольной части tablespace.
Неактивен
Если ВСЕ таблицы пустые, какая разница, в какой части tablespace они находятся?
Неактивен
Есть два ответа - простой и сложный.
1. Сложный
Пусть у тебя есть файлик из 10 байт, вот такой:
0000000010
Ты хочешь убрать "ненужную" его часть - оставить, например, три байта. И обрезать
хвост. Есть разница между тупым обрезанием и переносом единички влево и последующим
обрезанием.
2. Простой
Not implemented
Неактивен
Понятно. Только мне казалось, что если все таблицы пустые, то весь файл будет записан нулями и не будет разницы, какую часть файла убирать.
Неактивен
Там же куча внутренних данных все равно, даже в пустой таблице.
> create table qwe (a int) engine=innodb;
Query OK, 0 rows affected (0.05 sec)
> show table status like 'qwe'\G
*************************** 1. row ***************************
Name: qwe
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2008-06-19 19:35:24
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment: InnoDB free: 4096 kB
1 row in set (0.00 sec)
Неактивен
Если все таблицы пустые, ничего не мешает пересоздать tablespace заново и воссоздать таблицы. Реальная потребность в работе с tablespace, когда таблицы не вполне пустые или совсем не пустые. В ndb это реализовано посредством множественных tablespace - создается новый tablespace с нужными параметрами, переносятся туда таблицы с помощью ALTER TABLE, затем старый tablespace удаляется. Для Innodb такой возможности нет. В планах сделать такой механизм и для Falcon.
Неактивен
rgbeast написал:
Если все таблицы пустые, ничего не мешает пересоздать tablespace заново и воссоздать таблицы.
Не-а. MySQL будет думать, что таблицы есть (по frm-файлам), а InnoDB не будет ничего о них знать - получишь ошибку.
Неактивен
у меня такая же проблема...
как я понял, что бы уменьшить размер этого файла мне необходимо сделать дамп базы, а потом удалить файл и восстановить базу из дампа?
Неактивен
Сделать дамп базы, удалить _все_ файлы InnoDB, запустить сервер и восстановить базу
из дампа. Не забудьте перед запуском сервера поставить innodb_file_per_table - это сэкономит
время в будущем (если, конечно, у Вас нету нескольких тысяч таблиц - тогда может замедлить
сервер).
Неактивен
а на сколько это примерно уменьшит объем бд?
Неактивен
Может и не уменьшить вообще - все зависит от соотношения размера реальных данных и
размера файла. Если у Вас были длительные транзакции, которые держат страницы данных,
то может быть и значительно.
Неактивен