目录

文/温国兵

一 引子

在 MySQL 中,可以有如下几种途径实现唯一值:

自增序列

UUID() 函数

程序自定义

UUID 基于 16 进制,由 32 位小写的 16 进制数字组成,如下:

aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee

比如123e4567-e89b-12d3-a456-426655440000就是一个典型的 UUID。

MySQL 实现了 UUID,并且提供 UUID() 函数方便用户生成 UUID。在 MySQL 的 UUID() 函数中,前三组数字从时间戳中生成,第四组数字暂时保持时间戳的唯一性,第五组数字是一个 IEEE 802 节点标点值,保证空间唯一。使用 UUID() 函数,可以生成时间、空间上都独一无二的值。据说只要是使用了 UUID,都不可能看到两个重复的 UUID 值。当然,这个只是在理论情况下。

二 MySQL UUID() 函数

mysql -uroot -proot

mysql> SHOW VARIABLES LIKE '%version%';

+-------------------------+------------------------------+

| Variable_name | Value |

+-------------------------+------------------------------+

| innodb_version | 5.5.40 |

| protocol_version | 10 |

| slave_type_conversions | |

| version | 5.5.40-log |

| version_comment | MySQL Community Server (GPL) |

| version_compile_machine | x86_64 |

| version_compile_os | linux2.6 |

+-------------------------+------------------------------+

7 rows in set (0.00 sec)

mysql> SELECT UUID(), UUID(), LENGTH(UUID()), CHAR_LENGTH(UUID()) \G

*************************** 1. row ***************************

UUID(): 19a87b1a-a298-11e4-aa3c-08002735e4a4

UUID(): 19a87b26-a298-11e4-aa3c-08002735e4a4

LENGTH(UUID()): 36

CHAR_LENGTH(UUID()): 36

1 row in set (0.00 sec)

mysql> SELECT UUID(), UUID(), LENGTH(UUID()), CHAR_LENGTH(UUID()) \G

*************************** 1. row ***************************

UUID(): 450e1572-a298-11e4-aa3c-08002735e4a4

UUID(): 450e157c-a298-11e4-aa3c-08002735e4a4

LENGTH(UUID()): 36

CHAR_LENGTH(UUID()): 36

1 row in set (0.00 sec)

可以看到,同一个 SQL 语句中,多处调用 UUID() 函数得到的值不相同。也就是说每次调用 UUD 函数都会生成一个唯一的值。并且多次调用或执行得到的后两组值相同。另外,本身 UUID 是 32 位,因为 MySQL 生成的 UUID 有四个中划线,所以在 utf8 字符集里,长度为 36 位。

我们关闭 MySQL,然后启动。

/etc/init.d/mysqld stop

Shutting down MySQL. [ OK ]

/etc/init.d/mysqld start

Starting MySQL.. [ OK ]

再次调用 UUID() 函数。

mysql> SELECT UUID(), UUID(), LENGTH(UUID()), CHAR_LENGTH(UUID()) \G

*************************** 1. row ***************************

UUID(): 586546b2-a298-11e4-b0fc-08002735e4a4

UUID(): 586546c5-a298-11e4-b0fc-08002735e4a4

LENGTH(UUID()): 36

CHAR_LENGTH(UUID()): 36

1 row in set (0.00 sec)

可以看到,第四组的值与重启之前发生变化,直到下一次重启 MySQL。

我们连接到另一台服务器,再次调用 UUID() 函数。

mysql> SELECT UUID(), UUID(), LENGTH(UUID()), CHAR_LENGTH(UUID()) \G

*************************** 1. row ***************************

UUID(): 8fa81275-a298-11e4-8302-0800276f77f9

UUID(): 8fa81291-a298-11e4-8302-0800276f77f9

LENGTH(UUID()): 36

CHAR_LENGTH(UUID()): 36

1 row in set (0.00 sec)

可以看到跟之前的数据不同,包括第五组数据。因为第五组的值跟机器相关,所以,同一台机器第五组值不变,不同机器则变。

三 复制中的 UUID()

3.1 实验环境介绍

主机IP地址主机名备注

rhel-01:

10.10.2.231

rhel-01

master

rhel-02:

10.10.2.227

rhel-02

slave

操作系统版本:RHEL 6.5

所需要的软件包:mysql-5.5.40-linux2.6-x86_64.tar.gz

3.2 搭建复制环境

3.3 基于 STATEMENT 模式

rhel-01 中做如下设置,设置为 STATEMENT 模式。

mysql> SET tx_isolation="REPEATABLE-READ";

Query OK, 0 rows affected (0.00 sec)

mysql> SET binlog_format="STATEMENT";

Query OK, 0 rows affected (0.00 sec)

rhel-02 也做如下设置:

mysql> SET tx_isolation="REPEATABLE-READ";

Query OK, 0 rows affected (0.00 sec)

mysql> SET binlog_format="STATEMENT";

Query OK, 0 rows affected (0.00 sec)

rhel-01 创建测试表,插入测试数据。在插入数据之后,还可以看到一个警告。

mysql> USE test;

Database changed

mysql> CREATE TABLE user

-> (name VARCHAR(36),

-> en_name VARCHAR(20),

-> job VARCHAR(10),

-> addr VARCHAR(20)

-> ) DEFAULT CHARSET=utf8 ENGINE=InnoDB;

Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO user(name, en_name, job, addr) \

VALUES(UUID(), "robin", "dba", "GZ");

Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> SHOW WARNINGS;

| Level | Code | Message |

+-------+------+-----------------------------------------------------+

| Note | 1592 | Unsafe statement written to the binary log using statement \

format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because \

it uses a system function that may return a different value on the slave. |

+-------+------+-----------------------------------------------------+

1 row in set (0.00 sec)

mysql> SELECT * FROM user \G

*************************** 1. row ***************************

name: 24d785a2-a29c-11e4-b0fc-08002735e4a4

en_name: robin

job: dba

addr: GZ

1 row in set (0.00 sec)

rhel-02 查看复制的数据。

mysql> USE test;

Database changed

mysql> SELECT * FROM user \G

*************************** 1. row ***************************

name: 24cd38fe-a29c-11e4-8302-0800276f77f9

en_name: robin

job: dba

addr: GZ

1 row in set (0.00 sec)

可以看到,rhel-01 中的 UUID 值为24d785a2-a29c-11e4-b0fc-08002735e4a4,rhel-02 中的值为 24cd38fe-a29c-11e4-8302-0800276f77f9,两个值居然不相同,亦即主从不一致。那这样的复制是没有什么意义的。因为 UUID() 函数属于不确定函数,所以不支持 STATEMENT 模式。

3.4 基于 MIXED 模式

rhel-01 中做如下设置,设置为 MIXED 模式。

mysql> SET binlog_format="MIXED";

Query OK, 0 rows affected (0.00 sec)

rhel-02 中做如下设置:

mysql> SET binlog_format="MIXED";

Query OK, 0 rows affected (0.00 sec)

rhel-01 插入测试数据。

mysql> INSERT INTO user(name, en_name, job, addr) \

VALUES(UUID(), "Wentasy", "dba", "GZ");

Query OK, 1 row affected (0.06 sec)

mysql> SELECT * FROM user \G

*************************** 1. row ***************************

name: 24d785a2-a29c-11e4-b0fc-08002735e4a4

en_name: robin

job: dba

addr: GZ

*************************** 2. row ***************************

name: 8dc2c93c-a29c-11e4-b0fc-08002735e4a4

en_name: Wentasy

job: dba

addr: GZ

2 rows in set (0.00 sec)

rhel-02 查看复制的数据。可以看到 MIXED 模式下,两台服务器的 UUID 相同,亦即主从一致。

mysql> SELECT * FROM user \G

*************************** 1. row ***************************

name: 24cd38fe-a29c-11e4-8302-0800276f77f9

en_name: robin

job: dba

addr: GZ

*************************** 2. row ***************************

name: 8dc2c93c-a29c-11e4-b0fc-08002735e4a4

en_name: Wentasy

job: dba

addr: GZ

2 rows in set (0.00 sec)

3.5 基于 ROW 模式

rhel-01 中做如下设置,设置为 ROW 模式。

mysql> SET binlog_format="ROW";

Query OK, 0 rows affected (0.00 sec)

rhel-02 也做如下设置,

bash mysql> SET binlog_format="ROW"; Query OK, 0 rows affected (0.00 sec)

rhel-01 插入测试数据。

mysql> INSERT INTO user(name, en_name, job, addr) \

VALUES(UUID(), "dbarobin", "dba", "GZ");

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM user \G

*************************** 1. row ***************************

name: 24d785a2-a29c-11e4-b0fc-08002735e4a4

en_name: robin

job: dba

addr: GZ

*************************** 2. row ***************************

name: 8dc2c93c-a29c-11e4-b0fc-08002735e4a4

en_name: Wentasy

job: dba

addr: GZ

*************************** 3. row ***************************

name: d8123587-a29c-11e4-b0fc-08002735e4a4

en_name: dbarobin

job: dba

addr: GZ

3 rows in set (0.00 sec)

rhel-02 查看复制的测试数据。

mysql> SELECT * FROM user \G

*************************** 1. row ***************************

name: 24cd38fe-a29c-11e4-8302-0800276f77f9

en_name: robin

job: dba

addr: GZ

*************************** 2. row ***************************

name: 8dc2c93c-a29c-11e4-b0fc-08002735e4a4

en_name: Wentasy

job: dba

addr: GZ

*************************** 3. row ***************************

name: d8123587-a29c-11e4-b0fc-08002735e4a4

en_name: dbarobin

job: dba

addr: GZ

3 rows in set (0.00 sec)

可以看到,在 ROW 模式下,复制的数据和主服务器相同,亦即主从一致。

四 UUID_SHORT() 函数

在 MySQL 5.1 之后的版本,提供 UUID_SHORT() 函数,生成一个 64 位无符号整数。另外,需要注意的是,server_id 的范围必须为 0-255,并且不支持 STATEMENT 模式复制。

mysql> SELECT UUID_SHORT();

+-------------------+

| UUID_SHORT() |

+-------------------+

| 95914352036544514 |

+-------------------+

1 row in set (0.00 sec)

五 小结

同一个 SQL 语句中,多处调用 UUID() 函数得到的值不相同,多次调用或执行得到的后两组值相同。

同一台服务器,重启 MySQL 前后的 UUID() 第四组值发生变化,第五组值不变;

MySQL 中,utf8 字符集下,生成的 UUID 长度为 36 位;

不同机器生成的 UUID 不同,包括第五组值;

在复制环境中,使用到 UUID() 函数,则一定要使用基于行或者基于混合模式复制方式。

六 Ref

–EOF–

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

mysql数据库uuid函数_[转载]MySQL UUID() 函数相关推荐

  1. mysql数据库建仓范式_存mysql个数

    MySQL学习笔记之数据类型详解 注:以下内容针对MySQL5.0及以上版本 MySQL的数据类型非常多,选择正确的数据类型对于获得高性能至关重要,本文是我结合网上看到的一些blog加上<高性能 ...

  2. mysql数据库服务器重启_重启mysql数据库服务器

    Mysql错误代码大全 1016错误:文件无法打开,使用后台修复或者使用phpmyadmin进行修复. 1044错误:数据库用户权限不足,请联系空间商解决 1045错误:数据库服务器/数据库用户名/数 ...

  3. mysql数据库范围之内_是mysql范围

    MySQL数据类型-decimal详解 1.首先,对于精度比较高的东西,比如money,我会用decimal类型,不会考虑float,double,因为他们容易产生误差,numeric和decimal ...

  4. mysql数据库不小于_小于mysql

    mysql启用hugepage 1 hugepage在linux 2.6以后的内核才支持,mysql中只有innodb引擎才支持,hugepage作用: 1.减少内存置换 2.减少TLB miss次数 ...

  5. mysql数据库搜索字符_在MySQL数据库中快速搜索字符串?

    使用FULLTEXT搜索来快速搜索字符串.让我们首先创建一个表-mysql> create table DemoTable1554 -> ( -> Title text ->  ...

  6. mysql数据库断开连接_解决mysql服务器在无操作超时主动断开连接的情况

    我们在使用mysql服务的时候,正常情况下,mysql的设置的timeout是8个小时(28800秒),也就是说,如果一个连接8个小时都没有操作,那么mysql会主动的断开连接,当这个连接再次尝试查询 ...

  7. mysql数据库的目录_了解MySQl数据库目录

    数据库目录是MySQL数据库服务器存放数据文件的地方,不仅包括有关表的文件,还包括数据文件和MySQL的服务器选项文件.不同的分发,数据库目录的缺省位置是不同的. 数据目录的位置 缺省的数据库位置 缺 ...

  8. 更改mysql数据库存放位置_更改mysql数据库存放位置

    由于要做一个数据库的测试,所以选了台虚拟机进行,无奈硬盘分的太小,数据太大. 只能把数据放到新的硬盘上.所以要更改数据库的存储位置. 1.新添加块硬盘,分区,挂载到/mysql下,新建lib文件夹. ...

  9. mysql数据库引擎转换_[转]MySQL数据库引擎

    经常用MySQL数据库,但是,你在用的时候注意过没有,数据库的存储引擎,可能有注意但是并不清楚什么意思,可能根本没注意过这个问题,使用了默认的数据库引擎,当然我之前属于后者,后来成了前者,然后就有了这 ...

  10. mysql数据库特点特性_简述MySQL数据库的特性和优势

    众所周知,MySQL数据库速度快.可靠性强,而且极具适应性.因此可以说,MySQL是管理内容的最好选择,尤其是对于在不需要事务化处理的情况下.本文就和大家一起来认识一下MySQL数据库,了解它的特性和 ...

最新文章

  1. python map用法_Python中ChainMap的一种实用用法
  2. Matlab中左除和右除
  3. blackarch 安装美化等
  4. Notepad++远程连接Linux系统
  5. php server自定义函数,php:SQL Server用户自定义的函数种类详解
  6. linq查询不包含某个值的记录_MySQL行(记录)的详细操作
  7. 【intellij idea 高级用法之:集成JIRA、UML类图插件、集成SSH、集成FTP、Database管理 】
  8. CouchBase C 客户端接口调用实例
  9. 想看程序员的成长课这本书
  10. 51nod-1350:斐波那契表示
  11. iocomp iPlot使用说明13 Limits绘图界限
  12. 86版五笔-拆字规则
  13. php的console.log,console.log()的作用
  14. 小白秒变大神--windows窗口+装B神器大全 两部曲
  15. 旭阳集团锚定“2025” 企业卓越运营让信息化来帮忙
  16. Matlab GUI编程技巧(十七):Matlab GUI设计总结
  17. 解决百度上传WebUploader在IE浏览器下点击无反应的问题
  18. 聚观早报 | 吉利正式收购魅族科技;雷军:对标iPhone不是口号
  19. 如何快速无损地把flv格式文件转换为mp4格式(可在iPhone上播放)
  20. 26个顶尖战略咨询公司常用分析模型详解!

热门文章

  1. AI观察|机器人成为了我们的好伙伴,你愿意吗?
  2. python奇数阶乘求和_使用Python阶乘求和的方法及问题总结
  3. 牛客真题编程——day5
  4. Dom生成Xml和解析Xml
  5. SVN分支开发管理(SmartSVN)
  6. C语言union类型需要注意的地方
  7. HR看过来:捕捉“大师球”程序员的错误做法
  8. win7计算机用户权限,怎么设置win7用户系统权限?设置用户权限教程
  9. 咻商跨境电商丨Shopee开店相关干货分享!
  10. vue前端国密SM2, SM4 算法实现