選擇語言Bahasa Indonesia (Bahasa Indonesia)Bahasa Malaysia (Malay)Čeština (Czech)Dansk (Danish)Deutsch (German)English (English)Español (Spanish)繁體中文 (Chinese (Traditional))Français (French)한국어 (Korean)Italiano (Italian)简体中文 (Chinese (Simplified))Nederlands (Dutch)日本語 (Japanese)Norsk (Norwegian)Polski (Polish)Português (Portuguese)Română (Romanian)Русский (Russian)Svenska (Swedish)Tagalog (Tagalog)ภาษาไทย (Thai)Türkçe (Turkish)العربية (Arabic)
عفواً، لم نتمكن من العثور على الصفحة التي تبحث عنها. برجاء المحاولة مرة أخرى للصفحة السابقة أو الانتقال لـمركز المساعدة للمزيد من المعلومات
الإنتقال لموجزك الرئيسيOmlouváme se, nemůžeme najít stránku, kterou hledáte. Zkuste se vrátit zpátky na předchozí stránku, nebo se podívejte do našeho Centra nápovědy pro více informací
Přejít do informačního kanáluVi kan desværre ikke finde den side, du leder efter.
![](http://toto-school.ru/wp-content/plugins/a3-lazy-load/assets/images/lazy_placeholder.gif)
Die gewünschte Seite konnte leider nicht gefunden werden. Versuchen Sie, zur vorherigen Seite zurückzukehren, oder besuchen Sie unseren Hilfebereich, um mehr zu erfahren.
Zu Ihrem FeedUh oh, we can’t seem to find the page you’re looking for. Try going back to the previous page or see our Help Center for more information
Go to your feedVaya, parece que no podemos encontrar la página que buscas. Intenta volver a la página anterior o visita nuestro Centro de ayuda para más información.
Ir a tu feedNous ne trouvons pas la page que vous recherchez. Essayez de retourner à la page précédente ou consultez notre assistance clientèle pour plus d’informations
Ouvrez votre filMaaf, sepertinya kami tidak dapat menemukan halaman yang Anda cari.
![](/800/600/https/user-images.githubusercontent.com/194400/53691494-2dc81280-3d77-11e9-8138-bf6f1dc72bf4.png)
Non abbiamo trovato la pagina che stai cercando. Prova a tornare alla pagina precedente o visita il nostro Centro assistenza per saperne di più.
Vai al tuo feed申し訳ありません。お探しのページが見つかりません。前のページに戻るか、ヘルプセンターで詳細をご確認ください
フィードに移動원하시는 페이지를 찾을 수 없습니다. 이전 페이지로 돌아가거나 고객센터에서 자세히 알아보세요.
홈으로 가기Harap maaf, kami tidak dapat menemui laman yang ingin anda cari. Cuba kembali ke laman sebelumnya atau lihat Pusat Bantuan kami untuk maklumat lanjut
Pergi ke suapanDe pagina waar u naar op zoek bent, kan niet worden gevonden. Probeer terug te gaan naar de vorige pagina of bezoek het Help Center voor meer informatie
Ga naar uw feedVi finner ikke siden du leter etter.
![](/800/600/https/kaamos.me/talks/devconf17/images/physical_format_update_key.png)
Nie możemy znaleźć strony, której szukasz. Spróbuj wrócić do poprzedniej strony lub nasze Centrum pomocy, aby uzyskać więcej informacji
Przejdź do swojego kanałuA página que você está procurando não foi encontrada. Volte para a página anterior ou visite nossa Central de Ajuda para mais informações
Voltar para seu feedNe pare rău, nu găsim pagina pe care o căutaţi. Reveniţi la pagina anterioară sau consultaţi Centrul nostru de asistenţă pentru mai multe informaţii
Accesaţi fluxul dvs.Не удаётся найти искомую вами страницу. Вернитесь на предыдущую страницу или посетите страницу нашего справочного центра для получения дополнительной информации.
Перейти к лентеSidan du letar efter hittades inte.
![](/800/600/https/fuzeservers.ru/wp-content/uploads/2/4/e/24e517b595ce5b40a8b8387c6bbbd97d.png)
ขออภัย ดูเหมือนเราไม่พบหน้าที่คุณกำลังมองหาอยู่ ลองกลับไปที่หน้าเพจก่อน หรือดู ศูนย์ความช่วยเหลือ ของเราสำหรับข้อมูลเพิ่มเติม
ไปที่ฟีดของคุณNaku, mukhang hindi namin mahanap ang pahina na hinahanap mo. Subukang bumalik sa nakaraang pahina o tingnan ang aming Help Center para sa higit pang impormasyon
Pumunta sa iyong feedAradığınız sayfa bulunamadı. Önceki sayfaya geri dönün veya daha fazla bilgi için Yardım Merkezimizi görüntüleyin
Haber akışınıza gidin抱歉,无法找到页面。试试返回到前一页,或前往帮助中心了解更多信息
前往动态汇总我們好像找不到該頁面。請回到上一頁或前往說明中心來進一步瞭解
前往首頁動態Типы данных PostgreSQL — BIGINT [База знаний Ispirer Migration]
Версии : PostgreSQL 8. x и 7.x
PostgreSQL — БОЛЬШОЙ | |
---|---|
Синтаксис | БОЛЬШОЙ |
Данные | 64-битные целочисленные данные |
Диапазон | -2 63 до 2 63 -1 |
Размер хранилища | 8 байт |
Синонимы | INT8 |
Стандарты | ANSI SQL |
PostgreSQL BIGINT — эквиваленты в других базах данных
База данных | Тип данных и преобразование |
---|---|
Оракул | НОМЕР(19,0) , -10 19 от -1 до 10 19 -1 |
SQL Server | BIGINT , -2 63 до 2 63 -1 |
MySQL | BIGINT , Подписано: -2 63 до 2 63 -1, Без знака: от 0 до 2 64 -0 |
Sybase ASE | БОЛЬШОЙ , Подпись: -2 63 до 2 63 -1, без знака: от 0 до 2 64 -1 |
Informix | БОЛЬШОЙ , -2 63 до 2 63 -1 |
HP Neoview | LARGEINT , -2 63 до 2 63 -1 |
Ingres | BIGINT , -2 63 до 2 63 -1 |
Связанные типы данных в PostgreSQL
Типы данных | |||
---|---|---|---|
Целые числа | INT | SMALLINT | |
Целые числа с автоматическим приращением | СЕРИЙНЫЙ | БОЛЬШОЙ СЕРИЙНЫЙ | |
Фиксированная точка | ДЕСЯТИЧНЫЙ (p,s) | ЦИФРОВОЙ (p,s) | |
С плавающей точкой | FLOAT(p) | REAL | DOUBLE PRECISION | 444
Все типы данных
Oracle | SQL Server | IBM DB2 | MySQL | 017 PostgreSQLSybase ASE | Sybase ASA | Informix DS | Teradata | HP Neoview | Interbase/Firebird | Ingres |
Домашняя страница Ispirer
Страница продукта Ispirer SQLWays — переход на PostgreSQL
Запросить SQLWays
Обеспечение совместимости приложений с таблицами Postgres BigInt Update
Ранее DoorDash полагался на Postgres в качестве основного хранилища данных и использовал модели базы данных Python Django для определения данных. По умолчанию поле идентификатора автоматически добавляется в качестве первичного ключа, который представляет собой целочисленное значение с автоинкрементом, верхняя граница которого составляет около 2,1 миллиарда (2 31 -1). Однако для поддержки быстрого роста бизнеса нам необходимо было преобразовать модели данных с Integer на BigInt до того, как мы исчерпали диапазон идентификаторов Integer, чтобы избежать целочисленного переполнения. В то время как мы смогли выполнить обновление типа данных первичного ключа в таблицах без простоев. Нам нужно было гарантировать, что наши системы будут полностью совместимы с обновлением таблицы BigInt.
Проблемы совместимости при обновлении до BigInt
Чтобы запустить идентификаторы помимо Integer, нам нужно было обновить первичный ключ таблицы и другие таблицы, ссылающиеся на первичный ключ, до BigInt. Кроме того, приложения, использующие обновленные таблицы, должны иметь возможность корректно вставлять и принимать данные, превышающие ограничение Integer. Ниже приведены некоторые проблемы, которые нам нужно было решить, прежде чем мы начали развертывать BigInt для наших систем:
Ограничение внешнего ключа не всегда присутствовало при перекрестных ссылках между таблицами
При обновлении типа данных первичного ключа в таблице нам нужно было обновить другие таблицы, в которых есть поля, ссылающиеся на обновленный первичный ключ, например, таблицы с внешним ключом в обновленном первичном ключе. Однако некоторые таблицы просто определяют обычное поле вместо использования ограничений внешнего ключа для ссылки на обновленный первичный ключ. В нашем случае, когда идентификатор заказа в таблице заказов был передан другому сервису, идентификатор заказа был сохранен как обычное поле с несвязанным именем target_id в их таблице. Такие ссылки без ограничения внешнего ключа было труднее идентифицировать.
Трудно определить, правильно ли обрабатываются идентификаторы в серверных приложениях с микросервисной архитектурой.
Не было простого способа подтвердить, может ли код приложения правильно обрабатывать новый тип данных идентификатора. В частности, для данных, которые использовались в разных доменах в рамках микросервисной архитектуры, разные потоки выполняются в изолированных сервисах. Трудно точно сказать, как передается обновленный идентификатор таблицы и как он обрабатывается внутри служб, использующих этот идентификатор. Например, если тип данных идентификатора определен как целое число в запросе API и ответе между службами или если в коде используется понижение типа данных с длинного на целое, мы можем получить исключения кода или неверные данные, когда мы начать использовать идентификаторы, превышающие диапазон целых чисел в любой таблице.
Гарантия совместимости на всех клиентских платформах и версиях
Аналогичные проблемы несовместимости типов данных также могут возникать в клиентских приложениях, ориентированных на пользователя, таких как наши Android, iOS и веб-приложения. Например, если клиентское приложение определяет объект данных с целочисленным идентификатором для получения ответа от серверной части, клиент не будет работать, когда серверная часть возвращает ответ с идентификатором, превышающим диапазон целых чисел. Нам также нужно было убедиться, что клиенты, совместимые с обновлением BigInt, хорошо работали не только в будущих версиях клиентов, но и в более старых версиях приложений.
Выявление проблем совместимости с помощью отдельных последовательностей postgreSQL для управления созданием данных
Мы разработали решение, которое может экспериментально использовать диапазон BigInt для небольших пользователей для выявления проблем совместимости до того, как bigInt достигнет всех пользователей. Вот процесс высокого уровня:
- Создана новая дополнительная последовательность postgreSQL с начальным идентификатором, превышающим верхнюю границу Integer, помимо исходной последовательности по умолчанию, для связи с обновленной таблицей 9 типа данных первичного ключа.0365
- Разработан новый путь кода, чтобы специально использовать новую последовательность для вставки данных за пределами целочисленного диапазона.
- Развернул новый путь кода для небольших пользователей, чтобы выявить и устранить потенциальные проблемы с использованием идентификаторов за пределами диапазона целых чисел, в то время как исходная последовательность идентификаторов в пределах диапазона целых чисел продолжает обслуживать оставшийся пользовательский трафик
- Новая последовательность переключена в качестве последовательности по умолчанию для таблицы, когда эксперименты подтвердили, что она работает надежно.
Подпишитесь на еженедельные обновления
Шаг 1. Создайте дополнительные последовательности для обновленных таблиц bigInt
После того, как тип данных первичного ключа в таблице и столбцы в других ссылочных таблицах были обновлены с Integer на BigInt (как обновить тип данных столбца в таблицах — еще одна большая тема, но не в центре внимания этого блога), таблицы могли работать с данными за пределами 2 31 -1. Мы создали отдельную последовательность с начальным идентификатором, превышающим верхнюю границу Integer. Мы выбрали новый стартер 2 32 . Значения между 2 31 и 2 32 -1 будут зациклены и станут отрицательными при усечении для представления в виде 32-битного целого числа со знаком. Отрицательные целые числа могут представлять собой драгоценный аварийный люк, если мы не подготовим все системы вовремя, прежде чем произойдет переполнение. Пример ниже показывает, как мы создали последовательность:
CREATE SEQUENCE __bigint_tablename_id_seq START WITH 4294967296;
Шаг 2.
![](/800/600/https/www.datocms-assets.com/36416/1605373623-networksetup-1ea656b3d07d1ba35a32e2df9af3787d.png?fit=crop&fm=jpg&w=825)
Мы продолжали использовать исходную последовательность по умолчанию, связанную с таблицей, для создания первичного ключа в диапазоне целых чисел для общедоступного трафика. Тем временем мы создали новый путь параллельного кода, в котором специально использовалась новая последовательность из шага 1 для создания идентификатора за пределами целочисленного ограничения при вставке записей в таблицу. Мы создали эксперимент, чтобы контролировать, какой путь кода использовать перед вставкой данных. Поток был показан на рисунке 1 ниже.
Рисунок 1. Использование двух разных последовательностей для вставки данных для значений идентификаторов в разные диапазоны типов данных в зависимости от того, используем ли мы новую последовательность или нет В приведенном ниже примере кода показано, как мы реализовали поток, показанный на рис. 1, в микросервисе на основе Kotlin, используя JDBI для взаимодействия с базой данных.
@GetGeneratedKeys
@SqlUpdate("вставить в $sampleTable ($insertColumns) значения ($insertValues)")
fun create(@BindKotlin obj: DBObj): Long
Первоначально мы использовали приведенный выше запрос для вставки новых данных, где $insertColumns, $insertValues не включали столбец ID и его значение, поэтому по умолчанию он будет сгенерирован автоматически. последовательность, связанная с таблицей. Последовательность по умолчанию сгенерировала идентификаторы в диапазоне целых чисел.
@GetGeneratedKeys("id")
@SqlUpdate("вставить в $sampleTable ( $insertColumnsWithId ) значения ( $insertValuesWithIdInNewSequence )")
fun createWithIdInNewSequence(@BindKotlin obj: DBObj): Long
Тем временем мы определили новый интерфейс выше, чтобы указать значение идентификатора при вставке новых данных. Это указанное значение идентификатора было сгенерировано из созданной нами новой последовательности. В запросе insertColumnsWithId = ":id, $insertColumns"
и insertValuesWithIdInNewSequence = "nextval('__new_sampletable_id_seq::regclass), $insertValues".
nextval('__new_sampletable_id_seq::regclass)
Мы провели эксперимент, чтобы выбрать, какую последовательность использовать при вставке данных в нашу систему. Когда была выбрана новая последовательность, мы смогли использовать идентификатор вне диапазона целых чисел для вставки данных.
если(пользователь в эксперименте){
создатьWithIdInNewSequence (объект)
} еще{
создать (объект)
}
Шаг 3. Используйте возможность вставки данных за пределами целочисленного диапазона для обнаружения проблем
Как мы заявили на шаге 2, мы сохранили текущую последовательность идентификаторов по умолчанию для обслуживания общедоступного трафика, прежде чем подтверждать, что все потоки и приложения могут обрабатывать Обновление BigInt. Тем временем мы развернули немного трафика для внутренних пользователей, чтобы использовать новый путь кода последовательностей и отслеживали любые отклонения.
Во время постепенного развертывания нам удалось обнаружить ряд проблем:
Ошибка чтения в обновленной таблице PK, поскольку API определил идентификатор в полезной нагрузке запроса/ответа как целое число
Хотя мы успешно вставили в таблицу данные, идентификаторы которых превышали диапазон целых чисел, некоторым API не удалось получить такие данные, поскольку запрос API принимаются только целочисленные идентификаторы. Чтобы исправить такие ошибки, нам просто нужно было исправить проблемные конечные точки, обновив тип данных param с Integer на Long в запросе или ответе.
Ошибка записи в ссылочные таблицы, так как ссылочные таблицы не были обновлены
От размещения заказа до доставки заказа сложные данные проходят через различные службы, и службы сохраняют необходимые данные в своих соответствующих базах данных. Во время развертывания теста мы получили отчеты от нашей нижестоящей службы о том, что у них были сбои при сохранении данных в их таблице из-за ссылки на идентификатор из нашей таблицы.
Оказалось, что мы не обновили их таблицу со ссылочным столбцом (без использования внешнего ключа) до нашей обновленной таблицы BigInt. Столбец в их таблице, ссылающийся на наш обновленный первичный ключ, по-прежнему имел целочисленный формат, что приводило к сбоям при записи данных в их таблицу, когда ссылочный идентификатор был сгенерирован новой последовательностью. Мы исправили эти пропущенные таблицы, обновив тип данных эталонного столбца, чтобы он соответствовал обновленной таблице BigInt.
Неверные идентификаторы сохранялись в таблицах из-за понижения идентификаторов без выявления ошибок
Успешной записи и чтения из новой последовательности BigInt было недостаточно; нам также нужно было подтвердить правильность данных. Например, у одной из команд было задание ETL для объединения данных из таблицы транзакций с таблицей заказов по идентификатору заказа для создания отчета о данных.
выберите * из порядка o
присоединиться к транзакции t на t.order_id = o.id
где …..
Хотя тип данных идентификатора заказа как в таблице заказов, так и в таблице транзакций был обновлен до BigInt, была строка кода, понижающая исходный идентификатор заказа с Long до Integer, и результат сохранялся в таблице транзакций.
targetId = orderId.toInt()
Эта операция приведения типа данных Long.toInt() может выполняться без ошибок. Но результирующее значение представлено младшими 32 битами этого длинного значения. Таким образом, данные, сгенерированные из новой последовательности, могли быть успешно записаны и прочитаны, но не правильно. Из-за неправильного приведения типа данных задание ETL не могло получить ожидаемый результат до того, как мы это исправим!
Шаг 4: Переключение новой последовательности в качестве последовательности по умолчанию для таблицы
После решения всех проблем на шаге 3 мы были уверены, что наши системы совместимы, когда идентификаторы начали выходить за диапазон целых чисел. Последнее, что нужно было сделать, это заменить исходную последовательность по умолчанию новой последовательностью в качестве нашего генератора идентификаторов по умолчанию. Это было необходимо, потому что, хотя исходная последовательность могла генерировать идентификаторы, превышающие диапазон целых чисел, она не знала, что часть идентификаторов за пределами диапазона целых чисел была занята новой последовательностью. Прежде чем две последовательности перекрывались, нам нужно было использовать только новую последовательность. поэтому мы связали нашу новую последовательность по умолчанию с таблицей и отказались от исходной последовательности.
Когда мы достигли этой точки, миграция обновления Bigint прошла гладко, и наши системы могли поддерживать идентификаторы за пределами целочисленного диапазона.
Заключение
В этой статье представлена методика добавления дополнительных последовательностей postgres для обнаружения проблем совместимости во время обновления bigInt таблицы postgres, чтобы убедиться, что при обновлении в наших системах не осталось слепых зон.![](/800/600/https/www.2ndquadrant.com/wp-content/uploads/2018/11/dimage_05.png)