|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Есть некая система (если это важно, то UserSide), которая использует в качестве БД MySQL. Есть самописный скрипт, который запускается каждые 5 минут и переносит в эту систему информацию из другой системы. Используется запрос такого вида: Код: sql 1. 2.
Таблица, соответственно, такая: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80.
Как я сейчас узнал, несмотря на срабатывание on duplicate key, счетчик на таблице все равно увеличивается. Вчера он переполнился и скрипт работать перестал. Заменять int на bigint я бы не хотел — система большая и неизвестно, где это вылезет боком. Я бы хотел просто "уплотнить" таблицу, перенумеровав ее заново (в этой таблице около 10к записей) и заодно обновив FK в зависимых таблицах. Вопроса у меня два. 1. Есть ли готовый скрипт или утилита для такого "уплотнения", который бы сам умел находить зависимости? 2. Можно ли это предотвратить в дальнейшем, чтобы счетчик не увеличивался, когда строка не добавляется? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 09:38 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
1. Если и есть, то работать она сможет только в случае, если имеется FK. 2. Нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 09:50 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Alibek B., Тут похожая проблема обсуждается https://habrahabr.ru/post/156489/ Пишут, что ODKU увеличит Auto Incriment поле на единицу для InnoDB, для MyIsam все работает правильно. Советуют также для автоинкремента использовать UNSIGNED Может будет полезно ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 10:52 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Ок. Тогда не поможете составить скрипт? Список зависимостей я составил вручную и сохранил в таблицу: Код: sql 1. 2. 3. 4. 5. 6.
Таблица соответствия идентификаторов (старый-новый) у меня подготовлена в таблице: Код: sql 1. 2. 3. 4.
Как мне пройтись по remap_base_ref, сгенерировав SQL, в котором указанные столбцы будут обновлены в соответствии с таблицей соответствия? Можно ли это сделать простым SQL-скриптом? Или нужно делать процедуру? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 10:55 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
paverПишут, что ODKU увеличит Auto Incriment поле на единицу для InnoDB, для MyIsam все работает правильно. У меня с MyISAM печальный опыт повреждения данных. Буду иметь ввиду, но хотелось бы найти другой способ. paverСоветуют также для автоинкремента использовать UNSIGNED Это несколько отсрочит проблему, но не решит ее. Правильнее будет написать процедуру "упаковки" и запускать ее раз в год. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 10:57 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Alibek B. но хотелось бы найти другой способ. Там в каментах варианты предлагаются, может что и подойдет ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 11:00 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Подскажите, что не так в запросе? Ошибочные блоки закомментированы. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
Как правильно выполнять динамический SQL в процедурах? И почему я не могу использовать в alter table переменную? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 11:55 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Alibek B.Как правильно выполнять динамический SQL в процедурах? https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html Alibek B.почему я не могу использовать в alter table переменную? В первом случае - надо смотреть, что получилось в переменной Q. Во втором случае - присваиваемое значение в предложении AUTO_INCREMENT является литералом, а не параметром. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 12:22 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
AkinaВ первом случае - надо смотреть, что получилось в переменной Q. Так дело даже до компиляции не доходит. Как только я задаю prepare с комментарием, процедура перестает сохраняться. AkinaВо втором случае - присваиваемое значение в предложении AUTO_INCREMENT является литералом, а не параметром. То есть нужно использовать динамический SQL? Или это можно как-то обойти? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 14:25 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Сейчас специально проверил. Пишу: Код: sql 1.
Процедура успешно сохраняется. Пишу: Код: sql 1.
Получаю ошибку: SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'Q; (хотя в Q валидный SQL, который сам по себе выполняется) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 14:28 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Странно, а так работает: Код: sql 1. 2.
Не подскажите, в чем разница? И почему такое все же не работает: Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 14:42 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Ну написано же, ё моё: https://dev.mysql.com/doc/refman/5.7/en/prepare.html preparable_stmt is either a string literal or a user variable that contains the text of the SQL statement. Два варианта: - string literal - user variable Всё! третьего не дано! локальные переменные - не катят. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 14:46 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Финальная версия скрипта: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
Не подскажите, есть что исправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 14:48 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Alibek B. Код: sql 1. 2.
А чего не сразу Код: sql 1.
? Alibek B.есть что исправить? Ну разве что вынести Код: sql 1.
за цикл, а REPLACE() делать в другую переменную... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2018, 16:20 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Вообщем все прошло успешно, никаких ошибок и сбоев не выявилось. Единственное, что я сделал еще — это добавил в первоначальный скрипт (который выполняет множество insert с ODKU) в конце alter table tbl_base AUTO_INCREMENT=<select max(CODE)+1 from tbl_base> — тогда не потребуется раз в год повторно делать "упаковку". ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2018, 11:53 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Я так понимаю, вы подтаскиваете абонентов из стороннего биллинга, который юзерсайдом напрямую не поддерживается, верно ? С новых версий у них есть свой API, возможно, имеет смысл его задействовать, а не мучить базу этой прекрасной учётной системы столь злым скриптом, переполняющим счётчик. http://wiki.userside.eu/API http://wiki.userside.eu/ERP_"USERSIDE" Хотя хак в автоинкрементом тоже ОК, главное, про бэкапы не забывать =) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 08:33 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
API построчный (за раз работает с одной записью) и тормозной. Да и неудобный. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 11:29 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Alibek B.alter table tbl_base AUTO_INCREMENT=<select max(CODE)+1 from tbl_base>Можно упростить: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 11:33 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
А дублей не будет? В таблице ведь уже есть записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 11:54 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Alibek B.А дублей не будет? В таблице ведь уже есть записи.Не будет. https://dev.mysql.com/doc/refman/5.7/en/alter-table.html To reset the current auto-increment value: Код: sql 1.
You cannot reset the counter to a value less than or equal to the value that is currently in use. For both InnoDB and MyISAM, if the value is less than or equal to the maximum value currently in the AUTO_INCREMENT column, the value is reset to the current maximum AUTO_INCREMENT column value plus one . ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 12:01 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
У меня в процедуре имеется цикл, внутри которого генерируется и выполняется динамический SQL: Код: sql 1. 2. 3. 4.
Хочу перед запуском процедуры убедится, что все генерируется правильно. Вызов SQL комментирую, а вместо него пишу: Код: sql 1.
В результате получаю несколько десятков однострочных resultset. Для читабельности хотелось бы вместо них получить один многострочный resultset. Это возможно сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 22:28 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 23:15 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Alibek B. В результате получаю несколько десятков однострочных resultset. Для читабельности хотелось бы вместо них получить один многострочный resultset. Код: sql 1.
А потом из нее прочитаете. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 23:41 |
|
Переполнился счетчик
|
|||
---|---|---|---|
#18+
Akina , это же не многострочный resultset. miksoft Пишите в таблицу: Так и сделал. Просто думал, что может быть в MySQL есть что-то вроде табличной переменной или возвращаемого курсора. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2020, 08:40 |
|
|
start [/forum/topic.php?fid=47&msg=39608383&tid=1828341]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 529ms |
0 / 0 |