Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день!
Имеется несколько вопросов, связанных с обслуживанием баз данных в mysql.
Есть программа (netams), которая ежесекундно сбрасывает в базу инфу. Останавливать его работу нельзя, ну или крайне нежелательно. Инфы достаточно много. В месяц база вырастает примерно на 5 гигов. Раз в полгода необходимо производить чистку базы, то есть удалять записи, старше чем предыдущие 6 месяцев.
Есть вопросы.
1. После удаления записей, таблицы, разумеется, фрагментированы. В таких случаях рекомендуется выполнять OPTIMIZE TABLE, но во время выполнения OPTIMIZE TABLE таблицы блокируются. Сама полная процедура очистки БД примерно в 25 гиг занимает достаточно долгое время, где-то 5 часов.
Правильно ли я понимаю, что когда будет выполняться OPTIMIZE TABLE, программа ничего никуда не сможет записать, то есть все данные просто пропадут?
Насколька безопасна эта процедура?
Вообще, во время выполнения DELETУ данные, грубо говоря, не удаляются, а только помечаются на удаление. То есть на это место будут записываться другие данные, если я правильно понимаю. Так может OPTIMIZE не нужен вообще в этом случае?
2. Бэкап базы производится помимо репликации ещё средствами mysqldump с ключём --opt.
Как следует из документации к mysql, mysqldump лочит таблицу оператором READ LOCAL, то есть в этом случае можно записывать данные в конец таблицы. Однако это работает в том случае, если системная переменная mysql concurrent_insert=1 и таблица нефрагментирована.
Если по первому пункту OPTIMIZE TABLE делать нельзя или отказаться от него, можно ли выставить concurrent_insert=2, чтобы данные при выполнении mysqldump могли писаться в конец таблицы даже при наличчи фрагментации? Чем это может быть чревато?
Тип таблицы: MyISAM
Типы полей: int, bigint, smallint, enum, varchar
Спасибо!
Неактивен
1. OPTIMIZE TABLE безусловно сожмет базу, но, разумеется, он ее и залочит. Процедура безопасна, т.к.
сначала создается рядом файлик с новой табличкой, а потом просто подменяется.
2. При бэкапе баз подумайте о mysqlhotcopy - оно копирует данные бинарно, соответственно, производится
быстрее.
Что касается глобальных вещей, можете сделать хитрость. Например, такую.
CREATE TABLE tbl_new LIKE table;
RENAME TABLE tbl TO tbl_old, tbl_new TO tbl;
Операция RENAME блокирующая, но моментальная. С tbl_old потом можно производить необходимые действия.
Неактивен
Спасибо за исчерпывающий и понятный ответ!
К mysqlhotcopy присматривался и задумываюсь о его применении, поскольку во–первых, быстрее, во–вторых это всё таки, грубо говоря, чистый слепок базы. То есть в случае аварии процедура восстановления вообще не составит никаких проблем. Но вроде как и с mysqldump неприятностей не было. Ну всмысле того, что бэкап делается и на работу программы с базой в этот момент не сказывается )
Единственное что смущает, это объём БД. Я никогда не восстанавливал базы такого объёма из sql файла, что делает mysqldump.
То что есть бэкап это хорошо, вопрос как он востановится ещё )
Вообще, есть какие-то ограничения по размер БД связанные с использованием mysqldump ну и разумеется с последующим восстановлением базы в случае аварии?
Ещё раз, премного благодарен за ответ!
Неактивен
Никаких ограничений MySQL нет. Теоретически Вы можете упереться в какие-нибудь ограничения
ОС (типа максимального размера файла), но в современных ОС таких проблем тоже, вроде бы, нет.
У бэкапов .sql есть только один недостаток - в случае необходимости их нужно накатывать. Т.е.
выполнять все запросы. Время практически равно времени optimize (по смыслу это одно и то же -
заполнение таблички со всеми данными) - т.е. в Вашем случае 5 часов.
Неактивен