看到张宴的博客上关于"http/rest客户端的文章",怎样安装啥的直接都跳过,下面直接进入测试阶段,测试环境:虚拟机 复制
代码 代码如下: [root@localhost ~]# uname -a Linux sunss 2.6.18-128.el5 #1 SMP Wed Jan 21 10:44:23 EST 2009 i686 i686 i386 GNU/Linux 内存和交换分区: 复制代码 代码如下: [root@localhost ~]# free -m total used free shared buffers cached Mem: 376 363 13 0 23 105 -/+ buffers/cache: 233 142 Swap: 1023 133 890 mysql: [root@localhost ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with or \g. Your MySQL connection id is 57 Server version: 5.1.26-rc-log Source distribution Type 'help' or '\h' for help. Type '\c' to clear the buffer. mysql> 使用的表结构: 复制代码 代码如下: DROP TABLE IF EXISTS `mytable`CREATE TABLE `mytable` ( `id` int(10) NOT NULL AUTO_INCREMENT, `addtime` int(10) NOT NULL, `title` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 php *** 作MySQL的程序: 复制代码 代码如下: <?php $type = $_GET['type']print_r($_GET)include_once("gettime.php")$btime = getmicrotime()$loop_cnt= 1000//循环次数 $db_host = '127.0.0.1'// $db_user = 'sunss'// $db_pass = '123456'// $db_name = 'test'// $db_link = mysql_connect($db_host, $db_user, $db_pass) or die("Connected failed: ".mysql_error()."\n")mysql_query('set names utf8')mysql_db_query($db_name, $db_link)if ("put" == $type) {//修改 $i = 1while ($i <= $loop_cnt) { $title = "jkjkjkjkjkjkjkjkjkjkjkjkjk"$tt = time()$sql = "update mytable set addtime=".$tt.",title='".$title."' where id='".$i."'"$res = mysql_query($sql)if (FALSE == $res) { echo "update failed!\n"} $i++} } else if ("delete" == $type) { //删除 $i = 1while ($i <= $loop_cnt) { $sql = "delete from mytable where id='".$i."'"echo "delete sql: ".$sql."<br>"$res = mysql_query($sql)if (FALSE == $res) { echo "delete failed!\n"} $i++} } else if ("post" == $type) { //添加 $i = 0while ($i <$loop_cnt) { $title = "hahahahahahahahahahahahahahahahahaha"$tt = time()$sql = "insert into mytable(addtime, title) values($tt, '".$title."')"//print "SQL: ".$sql."<br>"$res = mysql_query($sql)if (FALSE == $res) { echo "insert failed!\n"} $i++} } mysql_close()$etime = getmicrotime()$runTime = round($etime - $btime, 4)echo "runTime: ".$runTime."\r\n<br>"?> 单独执行php连接MySQL,单条连接添加1000条记录需要:0.9s左右 php *** 作memcache的程序: 复制代码 代码如下: <?php include_once("gettime.php")$btime = getmicrotime()//杩炴帴 $mem_host = "192.168.0.134"$mem_port = "11311"$timeout = 3600$i = 0$cnt = 1000while ($i <$cnt) { $mem = new Memcache$mem->connect($mem_host, $mem_port) or die("Could not connect!")$ret = $mem->set($i, "11111111111", 0, $timeout)if (false == $ret) { file_put_contents("insert_failed.log", "post failed!\n", FILE_APPEND)} $mem->close()$i++} //鍏抽棴杩炴帴 $etime = getmicrotime()$runTime = round($etime - $btime, 4)echo "runTime: ".$runTime."\r\n<br>"?> 单条连接添加1000条记录,需要0.8s左右, 创建触发器: 复制代码 代码如下: DELIMITER $$ DROP TRIGGER /*!50032 IF EXISTS */ `test`.`mytable_insert`$$ CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER `mytable_insert` AFTER INSERT ON `mytable` FOR EACH ROW BEGIN SET @tt_resu = (SELECT http_put(CONCAT('192.168.0.134/mem_ss.php?type=post&id=', NEW.id, "&data=", NEW.addtime), 11))END$$ 为触发器写个php更新memcache,代码如下: 复制代码 代码如下: <?php $id = $_GET['id']$type = $_GET['type']$json_data = $_GET['data']var_dump($_GET)//杩炴帴 $mem_host = "192.168.0.134"$mem_port = "11211"$timeout = 3600$mem = new Memcache$mem->connect($mem_host, $mem_port) or die("Could not connect!")if ("get" == $type ) { $val = $mem->get($id)echo $val//$arr = jsonDecode($val,'utf-8')//print_r($arr)} else if ("put" == $type) { $ret = $mem->replace($id, $json_data, 0, $timeout)if (false == $ret) { file_put_contents("replace_failed.log", "replace failed!\n", FILE_APPEND)} } else if ("delete" == $type) { $ret = $mem->delete($id)if (false == $ret) { file_put_contents("delete_failed.log", "delete failed!\n", FILE_APPEND)} } else if ("post" == $type) { $ret = $mem->set($id, $json_data, 0, $timeout)if (false == $ret) { file_put_contents("post_failed.log", "post failed!\n", FILE_APPEND)} } $mem->close()?> 使用php触发MySQL添加1000条记录,同时触发器触动php更新memcache,使用时间9s左右, 因为每次都关闭链接memcache,看是不是关闭链接导致慢,又写了一个程序: 复制代码 代码如下: <?php include_once("gettime.php")$btime = getmicrotime()//连接 $mem_host = "192.168.0.134"$mem_port = "11311"$timeout = 3600$i = 0$cnt = 1000while ($i <$cnt) { $mem = new Memcache$mem->connect($mem_host, $mem_port) or die("Could not connect!")$ret = $mem->set($i, "11111111111", 0, 3600)if (false == $ret) { file_put_contents("insert_failed.log", "post failed!\n", FILE_APPEND)} $mem->close()$i++} //关闭连接 $etime = getmicrotime()$runTime = round($etime - $btime, 4)echo "runTime: ".$runTime."\r\n<br>"?> 耗时0.9s左右,比一个连接慢不了多少。 为了定位是触发器慢还是http_put慢,创建一个临时表 tmp_mytable,表结构如下: 复制代码 代码如下: CREATE TABLE `mytable` ( `id` int(10) NOT NULL AUTO_INCREMENT, `addtime` int(10) NOT NULL, `title` varchar(255) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 再次修改触发器,如下: 复制代码 代码如下: DELIMITER $$ DROP TRIGGER /*!50032 IF EXISTS */ `test`.`mytable_insert`$$ CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER `mytable_insert` AFTER INSERT ON `mytable` FOR EACH ROW BEGIN insert into tmp_mytable values(NEW.id,NEW.addtime,NEW.title)END$$ 再次用php向MySQL中添加1000条记录,消耗时间0.7s左右,证明效率消耗在http_put,也就是mysql-udf-http慢。 不知道我的测试有错没?还请正在使用mysql-udf-http的高手,或者对mysql-udf-http有研究的高手指教。不要被报错误导,报错只能做参考,不一定像报错上说的那样找不到文件
我遇到过这个问题,udf文件如果有问题,也会报这个错
用sqlmap自带的lib_mysqludf_sys.so即可解决
在这个位置 \sqlmap-master\udf\mysql\linux\32\
背景
在上一篇推文中,我们介绍了 MySQL Group Replication 8.0.16 支持信息碎片化功能来增强大型事务处理能力。
如果您想在组复制中使用该功能,则任何组成员的版本都不能低于 8.0.16!
简单地说就是由于低版本协议上不支持。MySQL 8.0.16 的组通讯开始支持新协议,简称“分段协议”,之前的版本中只有一种“压缩协议”。
如果多个成员想加入复制组,那么在协议匹配上遵循以下原则:
现有复制组成员和新加入成员版本相同,加入成功。
低版本成员想加入高版本的组会被驱逐,加入失败。
高版本的成员想加入低版本的组,单独加入成功,多个加入失败。
例如:
一个 MySQL Server 8.0.16 实例可以成功加入使用通信协议版本 5.7.24 的组。
一个 MySQL Server 5.7.24 实例无法成功加入使用通信协议版本 8.0.16 的组。
两个 MySQL Server 8.0.16 实例无法同时加入使用通信协议版本 5.7.24 的组。
两个 MySQL Server 8.0.16 实例可以同时加入使用通信协议版本 8.0.16 的组。
新增 UDF
为了能让高版本的复制组更便于加入低版本的成员,MySQL 8.0.16 新增两个 UDF。
您可以使用两个新的 UDF 命令去管理组通信协议:
1. group_replication_set_communication_protocol(new_protocol)
设置组复制通讯协议版本
SELECT group_replication_set_communication_protocol("8.0.15")
填入一个所有成员都支持的版本号,即:new_protocol ≤ 所有成员的 MySQL版本。
new_protocol 格式:major.minor.patch (主版本号.次版本号.发布版本号)例如:8.0.15。
2. group_replication_get_communication_protocol()
获取复制中最旧成员的 MySQL 版本号
SELECT group_replication_get_communication_protocol() +------------------------------------------------+ | group_replication_get_communication_protocol() | +------------------------------------------------+ | 5.7.14 | +------------------------------------------------+
获取的版本号可能与设置的值不一致,但不一致的版本之间组复制协议是一样的。
返回结果格式:major.minor.patch (主版本号.次版本号.发布版本号)例如:8.0.15。
以上两个 UDF 对全部组成员有效,主机或从机上均可执行。
结论
若想使用信息碎片功能。建议将组复制成员全部升级为 8.0.16。
若组内成员版本仅有部分为 8.0.16,可以用两个新的函数来让高版本的成员保持与其它成员组协议一致。
请点击输入图片描述
评论列表(0条)