加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL的server_uuid取得之uuid 函数和uuid_short 函数

发布时间:2022-06-26 18:03:50 所属栏目:MySql教程 来源:互联网
导读:MySQL的server_uuid取得之uuid 函数和uuid_short 函数: 1、uuid()函数 mysql select uuid(),uuid(); +--------------------------------------+--------------------------------------+ | uuid() | uuid() | +--------------------------------------+--
         MySQL的server_uuid取得之uuid 函数和uuid_short 函数:

  1、uuid()函数
  mysql> select uuid(),uuid();  
  +--------------------------------------+--------------------------------------+  
  | uuid()                               | uuid()                               |  
  +--------------------------------------+--------------------------------------+  
  | 50120c25-d75c-11e7-9484-000c29c9278a | 50120c53-d75c-11e7-9484-000c29c9278a |  
  +--------------------------------------+--------------------------------------+  
  1 row in set (0.00 sec)  
  String *Item_func_uuid::val_str(String *str)  
  {  
      ...  
      macrand get  
      ...  
      uint32 time_low=            (uint32) (tv & 0xFFFFFFFF);  
      uint16 time_mid=            (uint16) ((tv >> 32) & 0xFFFF);  
      uint16 time_hi_and_version= (uint16) ((tv >> 48) | UUID_VERSION);  
      s[8]=s[13]='-';  
      tohex(s, time_low, 8);  
      tohex(s+9, time_mid, 4);  
      tohex(s+14, time_hi_and_version, 4);  
      strmov(s+18, clock_seq_and_node_str);  
      ...  
  }  
  详细产生uuid的过程,参考上面的函数进行分析。
  time_low、time_mid、time_high_and_version转成16进制后分别对应第1 2 3段。
  这个时间是从1582-10-15 00:00:00.00到当前时间的100ns值。(实际上系统只能取到精确us,再乘以10)。所以你短时间连续执行的话,比较可能只有第一个值在改,实际上1 2 3都可能会改变。第4段是你启动这个MySQL后第一次执行select uuid()时的随机数,每次重启会改变。第5段是mac值转过来的,同一个机器多实例的一般相同。如果mac值获取不到,则是一个随机值。所以这个值可以认为是每次执行都不相同。并且不同实例之间也只有极微小概率重复。
  2、uuid_short()函数
 
  mysql> select uuid_short(),uuid_short();  
  +--------------------+--------------------+  
  | uuid_short()       | uuid_short()       |  
  +--------------------+--------------------+  
  | 818004335832072194 | 818004335832072195 |  
  +--------------------+--------------------+  
  1 row in set (0.00 sec)  
  函数调用过程:
  main->init_common_variables()->  
      server_start_time= flush_status_time= my_time(0);  
      //获取server启动时的时间戳  
  ulonglong uuid_value;  
  main->init_common_variables->item_init->  
  void uuid_short_init()  
  {  
    uuid_value= ((((ulonglong) server_id) << 56) +   
                 (((ulonglong) server_start_time) << 24));  
  }  
  longlong Item_func_uuid_short::val_int()  
  {  
    ulonglong val;  
    mysql_mutex_lock(&LOCK_uuid_generator);  
    val= uuid_value++;  
    mysql_mutex_unlock(&LOCK_uuid_generator);  
    return (longlong) val;  
  }  
  与uuid()函数返回固定字符串不同,uuid_short()函数返回的是ulonglong类型的值。mysql启动后第一次执行的值通过server_id<<56+server_start_time<<24来初始化,其中
  server_start_time是server启动时的时间,单位是秒。之后每次执行该函数都+1
 
  3、server启动时,会自动产生server_uuid
  main->init_server_auto_options:处理server_uuid  
      my_load_defaults(fname, groups, &argc, &argv, NULL)//fname:auto.cnf  
      handle_options(&argc, &argv, auto_options, mysqld_get_one_option);  
      if(uuid){  
          strcpy(server_uuid, uuid);  
      }else{  
          flush= TRUE;  
          generate_server_uuid();  
      }  
      if (flush)  
          DBUG_RETURN(flush_auto_options(fname));  
          //O_CREAT|O_RDWR形式open,即如果没有auto.cnf文件,  
          //则创建一个并将生成的server_uuid写入文件并flush  
  generate_server_uuid:  
      func_uuid= new (thd->mem_root) Item_func_uuid();  
      func_uuid->fixed= 1;  
      func_uuid->val_str(&uuid);  
      strncpy(server_uuid, uuid.c_ptr(), UUID_LENGTH);  
  其中val_str函数是Item_func_uuid::val_str。server启动时,会从auto.cnf文件中读取,如果没有这个文件,则新创建文件并自动产生server_uuid,写入文件并flush。
 

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读