Mysql

更改 MySQL auto_increment_offset

  • January 23, 2020

對不起,文字牆,但我不知道什麼是相關的,什麼不是。

我有 MySQL 一個 MySQL 數據庫,它正在從我們的生產環境複製到我們的開發/測試環境,以便他們獲得 Web 應用程序的 DEV 端的實時更新。問題是,如果他們不能改變東西並送出它,那麼 DEV 就不是真正的 DEV。這是單向的,對 DEV 的更改不會複製回 prod,但這會產生一個問題,即如果他們在 DEV 數據庫中創建新條目,它們會留在 DEV 本地,但AUTO_INCREMENT如果數字在 PROD 中被重用(它不會看到下一個可用索引號的相同值,因為它對 DEV 中發生的事情視而不見)。

我想我可以通過auto_increment_offset在 GLOBAL 級別設置來解決這種衝突,以便新數據庫條目的 ID 在 30,000+ 範圍內,而 PROD 保持在 30,000 以下。

我在從站上設置變數,在主站上創建表,在主站上用值 1-4 填充它,這些值被複製到從站,但隨後嘗試INSERT從站上的數據,讓它在主數據庫的位置離開了。

mysql> describe test;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
+-------+------------------+------+-----+---------+----------------+
1 row in set (0.00 sec)
mysql> select * from test;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 30000 |
+--------------------------+-------+
2 rows in set (0.00 sec)

mysql> insert into test () VALUES ();
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  6 |
+----+
5 rows in set (0.00 sec)

mysql> delete from test where id=6;
Query OK, 1 row affected (0.00 sec)

我在網上搜尋並找不到任何東西。它似乎auto_increment_offset可能是為這種情況創建的,但它似乎沒有達到我預期的效果(從站生成的 ID 比主站中的 ID 高很多)。這是在某處保存的表級嗎?

任何級別的幫助將不勝感激。

您可以在文件中找到對您問題的解釋:“如果 auto_increment_offset 的值大於 auto_increment_increment 的值,則忽略 auto_increment_offset 的值。”

出於您的目的,保留它們的預設值並簡單地執行就足夠了: auto_increment_increment在從站上。auto_increment_offset``ALTER TABLE test AUTO_INCREMENT=30000

這將在您的奴隸上產生像 30001,30002,…,N 這樣的值。

ALTER TABLE some_table AUTO_INCREMENT=10000

這會將 AUTO_INCREMENT 設置為特定值。

引用自:https://dba.stackexchange.com/questions/61830