Bagaimana jika peningkatan otomatis mysql mencapai batas?

Dengan int, nilai maksimum yang didukung oleh SQL Server adalah 2.147.483.647. Karena Anda saat ini berada di 1.000, saya pikir Anda tidak perlu khawatir dulu

Jika Anda kehabisan nilai, maka jika Anda menggunakan IDENTITAS, Anda akan mendapatkan kesalahan runtime. Itu tidak akan secara otomatis berputar kembali. Jika Anda menggunakan URUTAN alih-alih IDENTITAS, maka Anda dapat menentukan yang harus berputar. Tetapi Anda perlu membuat perubahan kode untuk mengganti IDENTITAS dengan SEQUENCE

Mungkin opsi yang lebih baik untuk Anda, terutama karena Anda sudah mengatakan bahwa tabel tersebut adalah tabel kerja yang biasanya kosong, adalah secara berkala mengisi ulang kolom identitas. Cari DBCC CHECKIDENT di Books Online, dan berikan perhatian khusus pada opsi RESEED

Hanya untuk kelengkapan, saya juga akan menambahkan bahwa opsi lain adalah mengubah tipe data kolom menjadi bigint (nilai maksimum 9.223.372.036.854.775.807 - ini memungkinkan Anda memasukkan satu juta baris per detik, selama hampir 300.000 tahun berturut-turut)

Atau jika Anda takut akan meluap bahkan itu, Anda dapat mempertimbangkan untuk menggunakan desimal (38,0) - maksimum di sini adalah angka yang terdiri dari 38 9 (yang akan memungkinkan Anda mempertahankan kecepatan yang sama selama 31.709.791.983.764.586.586.504.312.531 tahun kekalahan)

AUTO_INCREMENT kunci utama berguna, karena mereka menyelamatkan kita dari masalah untuk menghasilkan nilai unik untuk setiap baris, mendelegasikan tugas ini ke database. Tapi saat kita mencapai batas kita perlu melakukan beberapa tindakan, atau kita tidak akan bisa menyisipkan lebih banyak baris

Pada tanggal 5 Mei 2020, GitHub mengalami periode nonaktif selama 2 jam 24 menit yang disebabkan oleh AUTO_INCREMENT nilai

Gibraltar from aboveGibraltar dari atas

Untuk meningkat atau tidak meningkat

Seseorang akan berpendapat bahwa AUTO_INCREMENT dilengkapi dengan apa yang disebut Insert Locks, yang dapat menyebabkan perselisihan untuk beban kerja intensif penulisan. Di sisi lain, membuat UUID akan menyebabkan kunci primer dan semua indeks sekunder menjadi lebih besar, dan sedikit kurang efisien. Jadi, sebagian besar orang lebih suka menggunakan AUTO_INCREMENT kunci utama

Masalah lainnya adalah semua tipe data memiliki nilai maksimum. Ketika Anda mencapai maksimum yang diizinkan untuk kunci utama Anda, Anda akan mendapatkan kesalahan

ERROR 1467 (HY000): Failed to read auto-increment value from storage engine

Untuk memperburuk masalah, AUTO_INCREMENT_ nilai hanya dapat meningkat. Tidak mungkin menurunkan penghitung untuk menggunakan nilai yang lebih rendah dari nilai tertinggi di kolom, bahkan jika ada "lubang"

Untuk pengguna MariaDB, solusi lain adalah menggunakan urutan, tetapi ini akan menjadi topik untuk artikel lain

PMM dan mysqld_exporter

Beberapa perangkat lunak pemantauan menyertakan grafik untuk AUTO_INCREMENT nilai

Misalnya, PMM (Percona Monitoring and Management) melakukannya dengan baik

PMM pane, with a list of tables and their % of used AUTO_INCREMENT valuesPanel PMM menampilkan nilai AUTO_INCREMENT tertinggi

Ini sebenarnya adalah fitur dari Prometheus mysqld_exporter, yang termasuk dalam PMM. Jika Anda menggunakannya tetapi tidak menggunakan PMM, yang harus Anda lakukan hanyalah memanggil eksportir dengan opsi --collect.auto_increment.columns 

SQL yang terhormat

Jika solusi pemantauan Anda tidak menyertakan AUTO_INCREMENT, atau jika ya, tetapi Anda ingin tahu cara melakukannya, Anda mungkin ingin melihat kueri yang dapat digunakan untuk memantau progres nilai AUTO_INCREMENT 

SELECT
    t.TABLE_SCHEMA AS `schema`,
    t.TABLE_NAME AS `table`,
    t.AUTO_INCREMENT AS `auto_increment`,
    c.DATA_TYPE AS `pk_type`,
    (
        t.AUTO_INCREMENT /
        (CASE DATA_TYPE
            WHEN 'tinyint'
                THEN IF(COLUMN_TYPE LIKE '%unsigned',
                    255,
                    127
                )
            WHEN 'smallint'
                THEN IF(COLUMN_TYPE LIKE '%unsigned',
                    65535,
                    32767
                )
            WHEN 'mediumint'
                THEN IF(COLUMN_TYPE LIKE '%unsigned',
                    16777215,
                    8388607
                )
            WHEN 'int'
                THEN IF(COLUMN_TYPE LIKE '%unsigned',
                    4294967295,
                    2147483647
                )
            WHEN 'bigint'
                THEN IF(COLUMN_TYPE LIKE '%unsigned',
                    18446744073709551615,
                    9223372036854775807
                )
        END / 100)
    ) AS `max_value`
    FROM information_schema.TABLES t
    INNER JOIN information_schema.COLUMNS c
        ON t.TABLE_SCHEMA = c.TABLE_SCHEMA
        AND t.TABLE_NAME = c.TABLE_NAME
    WHERE
        t.AUTO_INCREMENT IS NOT NULL
        AND c.COLUMN_KEY = 'PRI'
        AND c.DATA_TYPE LIKE '%int'
;
_

Perhatikan bahwa saya membuat asumsi bahwa AUTO_INCREMENT kolom selalu menjadi bagian dari kunci utama. Saya merekomendasikan untuk memastikan mengikuti praktik yang baik ini. Namun belum tentu demikian, seperti dibahas di sini. Ubah kueri jika Anda merasa memiliki kolom non-primary key AUTO_INCREMENT 

Lihat juga

Ebook

Pelatihan

Kesimpulan

Kita membahas cara memeriksa apakah salah satu tabel Anda memiliki nilai AUTO_INCREMENT yang mendekati batasnya. Dalam artikel terpisah kita akan melihat cara memperbaiki masalah ini tanpa menyebabkan downtime

Berapa batas maksimum peningkatan otomatis MySQL?

Bilangan bulat bisa setinggi 2147483647. Jika unsigned bisa 4294967295 .

Apa yang terjadi jika kolom kenaikan otomatis mencapai nilai maksimum dalam tabel?

Gunakan tipe data bilangan bulat terkecil untuk kolom AUTO_INCREMENT yang cukup besar untuk menampung nilai urutan maksimum yang Anda perlukan. Saat kolom mencapai batas atas tipe data, upaya selanjutnya untuk membuat nomor urut gagal .

Apakah kenaikan otomatis merupakan kendala di MySQL?

Apa itu Bidang AUTO INCREMENT? . Seringkali ini adalah bidang kunci utama yang ingin kami buat secara otomatis setiap kali catatan baru dimasukkan. Auto-increment allows a unique number to be generated automatically when a new record is inserted into a table. Often this is the primary key field that we would like to be created automatically every time a new record is inserted.

Bisakah kita memiliki 2 kenaikan otomatis di MySQL?

Hanya satu nilai auto_increment numerik yang diperbolehkan . Setiap auto_increment harus memiliki kolom terkait untuk menentukan keunikan dari nilai auto_increment lain dalam tabel yang sama.