MySQL的server_uuid獲取之uuid()函式和uuid_short()函式
1、uuid()函式
server_start_time是server啟動時的時間,單位是秒。之後每次執行該函式都+1
3、server啟動時,會自動產生server_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);
- ...
- }
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;
- }
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);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2148191/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle中分析函式獲取之前最近的不為null的值Oracle函式Null
- MySQL(四)日期函式 NULL函式 字串函式MySql函式Null字串
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- Mysql 常用函式(15)- upper 函式MySql函式
- 【Mysql 學習】日期函式函式MySql函式
- 字元函式、數字函式和日期函式字元函式
- MySQL 函式MySql函式
- MySQL函式MySql函式
- Rust中的into函式和from函式Rust函式
- ascii函式和substr函式的用法ASCII函式
- 函式宣告和函式表示式的區別函式
- MySQL函式學習(一)-----字串函式MySql函式字串
- MySQL函式-條件判斷函式MySql函式
- MySQL 的日期和時間函式MySql函式
- MySQL 的IFNULL()、ISNULL()和NULLIF()函式MySqlNull函式
- Mysql 的trim() 函式MySql函式
- MYSQL的字串函式MySql字串函式
- MySql中時間和日期函式MySql函式
- gethostbyname函式和getservbyname函式的應用函式
- prop()函式和attr()函式的區別函式
- C++的函式和模板函式 (轉)C++函式
- strcpy函式和memcpy函式的區別函式memcpy
- 類函式和物件函式 PHP函式物件PHP
- Mysql 常用函式(1)- 常用函式彙總MySql函式
- mysql FIND_IN_SET函式、INSTR函式MySql函式
- MySQL 常用函式MySql函式
- MySQL 常用函式。MySql函式
- MySQL函式(一)MySql函式
- MySQL常用函式MySql函式
- mysql拼接函式MySql函式
- mysql函式大全MySql函式
- 14 mysql 函式MySql函式
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- 探索MySQL高階語句(數學函式、聚合函式、字串函式、日期時間函式)MySql函式字串
- Oracle OCP(03):字元函式、數字函式和日期函式Oracle字元函式
- JavaScript函式宣告和函式表示式區別JavaScript函式
- JavaScript中的compose函式和pipe函式JavaScript函式
- jquery position()函式和offset()函式的區別jQuery函式