|
|
|
Поведение при переименовывании таблицы внутри транзакции InnoDB
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Есть база, в которую собираются логи. Для уменьшения таблицы логов есть механизм, позволяющий часть данных за определенный период держать в другой таблице. Чтобы не кидать большие объемы между таблицами выбран вариант переименовывать таблицу и создавать новую для новых логов. Приложение на это время останавливать нельзя. Вот тут и вопрос: если внутри транзакции переименовать таблицу и создать новую, могут ли возникнуть проблемы с запросами, которые в это время параллельно пытаются добавить записи? Не пропадут ли они? Может стоит локать таблицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 09:26:21 |
|
||
|
Поведение при переименовывании таблицы внутри транзакции InnoDB
|
|||
|---|---|---|---|
|
#18+
АрхибабайДля уменьшения таблицы логов есть механизм, позволяющий часть данных за определенный период держать в другой таблице. Чтобы не кидать большие объемы между таблицами выбран вариант переименовывать таблицу и создавать новую для новых логов.Хуже было сложно что-то придумать - DDL в клиентском приложении, да ещё и в транзакции... если там гигабайты немеряные, партиционируйте таблицу по используемому критерию (дата-время записи?), что ли, или merge engine задействуйте для секционирования... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 10:30:32 |
|
||
|
Поведение при переименовывании таблицы внутри транзакции InnoDB
|
|||
|---|---|---|---|
|
#18+
АрхибабайЗдравствуйте. Есть база, в которую собираются логи. Для уменьшения таблицы логов есть механизм, позволяющий часть данных за определенный период держать в другой таблице. Чтобы не кидать большие объемы между таблицами выбран вариант переименовывать таблицу и создавать новую для новых логов. Приложение на это время останавливать нельзя. Вот тут и вопрос: если внутри транзакции переименовать таблицу и создать новую, могут ли возникнуть проблемы с запросами, которые в это время параллельно пытаются добавить записи? Не пропадут ли они? Может стоит локать таблицу? АХТУНГ если я верно помню, транкзанкции это механизм для селостности данных а не для структуры. тоесть нельзя в транкзанкцию толкать команды изменения структуры. поидее если в теле транкзанкции стоит команда структуры, то это значит что перед ней(командой переименования) - сработает либо автокомит если он включон, либо ролбек если автокомит отключон. тоесть в твоём случае получиться вот что. транкзанкция старт пара вставок данных например переименовываем таблицу = завершение транкзанкции, лок таблицы и переименование её в это время все что пыталось работать с этой таблицей, полетит с ошибками - ибо нет таблицы создаём новую дальше продолжилась наша работа и другая в штатном режиме конец транкзанкции ---конец какой??? ведь не открывалась :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 10:54:22 |
|
||
|
Поведение при переименовывании таблицы внутри транзакции InnoDB
|
|||
|---|---|---|---|
|
#18+
Akina, ну объемы не такие большие. Если эту операцию производить раз в месяц, то таблица будет 200-300мб. Разбиение по таблицам нужно не только для ускорения запросов чтения, а еще чтобы ежедневно снимаемый дамп был адекватных размеров. Внутри самой транзакции будут только запросы переименовывания и создания новой таблицы со старым именем. Запускал эту последовательность даже сейчас (данные за пол года, 12кк элементов) отрабатывает за 0.2 сек. Сам скрипт будет раз в месяц отрабатывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 10:54:28 |
|
||
|
Поведение при переименовывании таблицы внутри транзакции InnoDB
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, понял, спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 10:55:58 |
|
||
|
Поведение при переименовывании таблицы внутри транзакции InnoDB
|
|||
|---|---|---|---|
|
#18+
портиции вариант варианты аля процедура и менять процедуру - тоже только вставки уже в другую таблицу не получиться - ибо нельзя изменить процедуру альтером(тело её) не вариант всё другое, это просто повесить тригер который при удалении сделает вставку в архивную, и периодически самые старые записи удалять... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 10:59:38 |
|
||
|
Поведение при переименовывании таблицы внутри транзакции InnoDB
|
|||
|---|---|---|---|
|
#18+
alex564657498765453ролбек если автокомит отключон.Это какой-то эльфийский mysql В нашем земном варианте DDL-команды вызывают коммит: http://dev.mysql.com/doc/refman/5.0/en/commit.html Beginning a transaction causes any pending transaction to be committed. See Section 13.3.3, “Statements That Cause an Implicit Commit”, for more information. http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html The statements listed in this section (and any synonyms for them) implicitly end any transaction active in the current session, as if you had done a COMMIT before executing the statement . Data definition language (DDL) statements that define or modify database objects. ALTER TABLE, CREATE INDEX, DROP INDEX, DROP TABLE, RENAME TABLE.там есть свои нюансы, но про роллбэк - ни слова. И вообще implicit rollback вообще выполняется в единственном случае - если автокоммит отключён, и клиент завершил сессию, не послав явно коммит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 08:31:15 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38708826&tid=1834429]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 322ms |

| 0 / 0 |
