V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
Mayuyu
V2EX  ›  MySQL

insert 操作的时 AUTO_INCREMENT 的问题。

  •  
  •   Mayuyu · 2016-04-21 10:48:15 +08:00 · 3821 次点击
    这是一个创建于 3138 天前的主题,其中的信息可能已经有所发展或是发生改变。
    A服务器, A表, AUTO_INCREMENT是从0开始。
    B服务器, A表, AUTO_INCREMENT是从20000000开始。

    因为业务需要,所以可能会需要把 B 服务器的 A 表数据插入到 A 服务器的 A 表。然而问题来了。
    如果A服务器的 A表目前AUTO_INCREMENT是632 , B 服务器的 A 表 AUTO_INCREMENT 是20000514 。
    我往A表insert操作完之后, A表的AUTO_INCREMENT变成了20000515 。


    如果做到insert的时候不影响A服务器A表的自增ID咧?
    15 条回复    2016-05-04 15:41:36 +08:00
    archer2ee
        1
    archer2ee  
       2016-04-21 11:11:05 +08:00 via iPhone
    插入后不影响 A 的自增序列的话,整个表就乱套了,后续可能会导致 id 重复的问题。

    这种情况要么在插入到 A 的时候不带 id ,让其随 A 自增,要么就做 DB 同步吧。

    坐等高手。
    Mayuyu
        2
    Mayuyu  
    OP
       2016-04-21 11:15:20 +08:00
    @archer2ee 所以 B 服务器的 A 表自增 ID 才设为两千万啊。当初这样设计就是为了拿来同步用的,这样重复的可能性就小多了,然而万万没想到插入之后自增 id 也会变的问题。
    yuankui
        3
    yuankui  
       2016-04-21 11:16:18 +08:00
    shiji
        4
    shiji  
       2016-04-21 11:20:47 +08:00
    理论上就应该 AUTO_INCREMENT 变成 20000515 呀。

    如果你能确定这个表再怎么增加,都不会过 20000000 产生冲突, 你可以手动把 AUTO_INCREMENT 改回去,反正这种操作是不规范的也是不推荐的。
    hxsf
        5
    hxsf  
       2016-04-21 11:26:27 +08:00
    @Mayuyu
    > 当初这样设计就是为了拿来同步用的

    为什么不直接用 db 自带的同步功能?
    scusjs
        6
    scusjs  
       2016-04-21 12:35:51 +08:00
    数据同步过去后,
    alter table table_name AUTO_INCREMENT=n
    msg7086
        7
    msg7086  
       2016-04-21 12:41:51 +08:00
    @shiji
    @scusjs
    AUTO_INCREMENT 是不能小于数据表里字段最大值的。
    自增的作用本来就是指示表里数据最大值的,根本不是上面说的什么「拿来同步用」的。
    同步用老老实实上唯一 ID 。
    pubby
        8
    pubby  
       2016-04-21 13:14:14 +08:00
    master-master 的方式,不是应该设这两个参数么?

    A:
    auto-increment-increment = 2
    auto-increment-offset = 0

    B:
    auto-increment-increment = 2
    auto-increment-offset = 1


    auto-increment-increment=机器数 N
    auto-increment-offset = 每台机器序号 [0,1,....,N-1]
    void1900
        9
    void1900  
       2016-04-21 13:43:04 +08:00
    当初设计就有问题。。。
    BeanMr
        10
    BeanMr  
       2016-04-21 13:50:24 +08:00 via Android
    如果确认数据库数量为什么不用遗赠步长控制呢? A 库用奇数 B 用偶数!
    kamushin
        11
    kamushin  
       2016-04-21 14:01:26 +08:00
    AUTO_INCREMENT 不应该用作主键(提升数据库性能)外的任何目的.
    darasion
        12
    darasion  
       2016-04-21 14:11:01 +08:00
    为什么要这么做? 怕浪费 ID 空间么? 囧。
    Mayuyu
        13
    Mayuyu  
    OP
       2016-04-21 14:47:56 +08:00
    @darasion 因为公司会在其他很多城市都有业务,所以会在当地架一台服务器。
    魔都的作为主数据库,下面城市的数据会定时的插入到主库,但是为了每个城市的数据写入到上海数据库的时候不重复,所以才想到了用 2kw , 3kw 。。。。。一直到 9kw 。
    不是传统的主从或者主主,需求是:魔都的数据库里面有其他城市的数据,但其他城市的数据库里面只有本地的数据。但偶尔也可能会让本地有上海的数据。
    msg7086
        14
    msg7086  
       2016-04-22 02:28:40 +08:00
    @Mayuyu 你需要读写分离,多机写入。
    但是不管怎么搞,这样的设计都还是有问题的。
    minotaur
        15
    minotaur  
       2016-05-04 15:41:36 +08:00
    为啥不 mod 1024 ,用范围。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2662 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:24 · PVG 19:24 · LAX 03:24 · JFK 06:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.