国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

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

2024-07-24 12:34:44
字體:
來源:轉載
供稿:網友
         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)  
  {  
      ...  
      mac/rand 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。
 

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 全椒县| 迭部县| 靖宇县| 石狮市| 淅川县| 吉木萨尔县| 勐海县| 岐山县| 舞阳县| 阜南县| 翼城县| 怀柔区| 偏关县| 南京市| 临沂市| 潞城市| 聂拉木县| 东丽区| 长葛市| 贵德县| 苏尼特右旗| 定南县| 平江县| 岚皋县| 蕉岭县| 嘉善县| 班戈县| 家居| 遵化市| 武清区| 勐海县| 宜章县| 介休市| 光山县| 甘泉县| 岚皋县| 同江市| 介休市| 黄山市| 绍兴市| 三门峡市|