Что происходит, когда auto_increment на целочисленном столбце достигает баз данных max_value в базах данных?

StackOverflow https://stackoverflow.com/questions/2615417

Вопрос

Я реализую приложение базы данных, и я буду использовать как javadb, так и mysql в качестве базы данных. У меня есть столбец ID в моих таблицах, которые имеют целое число в качестве типа, и я использую базы данных AUTO_INCREMENT-FUNCTION для значения.

Но что происходит, когда я получаю более 2 (или 4) миллиарда постов и целое число недостаточно? Это целое число переполнено и продолжается или является брошенным исключением, что я могу справиться?

Да, я мог бы изменить надолго, как DataType, но как я могу проверить, когда это нужно? И я думаю, что есть проблема с получением last_inserted_id () - функции, если я использую долго, как DataType для ID-столбца.

Это было полезно?

Решение

Комментарий Джим Мартина от §3.6.9. «Использование AUTO_INCREMENT» документации MySQL:

На всякий случай, если есть какой-либо вопрос, поле AUTO_INCREMENT / не охватывает /. Как только вы попадаете на предел для размера поля, вставки генерируют ошибку. (Как за Джереми Коул)

Быстрый тест с MySQL 5.1.45 приводит к ошибке:

Ошибка 1467 (Hy000): не удалось прочитать значение автоматического приращения с механизма хранения

Вы можете проверить эту ошибку при вставке и принять соответствующие действия.

Другие советы

Просто чтобы успокоить нервы, рассмотрите это:

Предположим, у вас есть база данных, которая вставляет новое значение для каждого времени, когда пользователь выполняет какую-то транзакцию на вашем сайте.

С 64 битным целым числом в качестве идентификатора, то это состояние для переполнения: с населением мира 6 миллиардов, тогда, если каждый человек на земле выполняет транзакцию один раз в секунду каждый день, и каждый год (без отдыха) потребуется более 80 годы для вашего удостоверения личности, чтобы обернуть вокруг.

Т.е. только Google нужно смутно рассмотреть эту проблему изредка во время перерыва на кофе.

Вы будете знать, когда он собирается переполнить, глядя на самый большой идентификатор. Вы должны изменить его, прежде чем любое исключение даже близко к брошению.

На самом деле, вы должны спроектировать с достаточно большим типом данных, чтобы начать с. Ваша производительность базы данных не будет страдать, даже если вы используете 64 бит с самого начала.

Ответы здесь заявляют, что происходит, но только один ответ говорит, как обнаружить проблему (а затем только после произошедшего ошибки). Как правило, полезно иметь возможность обнаруживать эти вещи, прежде чем они станут производственным вопросом, поэтому я написал запрос для обнаружения, когда произойдет переполнение:

SELECT
  c.TABLE_CATALOG,
  c.TABLE_SCHEMA,
  c.TABLE_NAME,
  c.COLUMN_NAME
FROM information_schema.COLUMNS AS c
JOIN information_schema.TABLES AS t USING (TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME)
WHERE c.EXTRA LIKE '%auto_increment%'
  AND t.AUTO_INCREMENT / CASE c.DATA_TYPE
      WHEN 'TINYINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 255, 127)
      WHEN 'SMALLINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 65535, 32767)
      WHEN 'MEDIUMINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 16777215, 8388607)
      WHEN 'INT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 4294967295, 2147483647)
      WHEN 'BIGINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', '18446744073709551615', 9223372036854775807) # need to quote because column type defaults to unsigned.
      ELSE 0
    END > .9; # 10% buffer

Надеюсь, это поможет кому-то где-то.

Для MySQL 5.6, 3.6.9 Использование auto_increment. в говорит:

Используйте наименьший тип целочисленного типа для столбца AUTO_INCREMET, который достаточно большой, чтобы удерживать максимальное значение последовательности, которое вам понадобится. Когда колонна достигает верхнего предела типа данных, следующая попытка генерировать текущий номер последовательности.

Я хотел бы поделиться личным опытом, который я только что имел об этом. Использование NAGIOS + CHECK_MK + NDOUTILS. Ndoutils хранит все чеки в таблице под названием Nagios_ServiceChecks. Первичный ключ - это подпись into_increment. Что происходит с MySQL, когда этот предел варьируется? Ну, в моем случае mysql удаляет все записи, но последний. Стол сейчас почти пусто. Каждый раз, когда новая запись вставлена, старая удаляется. Не так ли это случится, но тот факт, что я потерял все мои записи. Idoutils, используемый с ICINGA (не Nagios), исправил эту проблему, изменяющую Int Bigint. Это не сгенерировало ошибку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top