-
小云妹今天带大家通过一张图快速读懂云数据库MySQL,让您更专注业务发展~云数据库MySQL服务介绍页入口:https://www.huaweicloud.com/product/mysql.html关系型数据库RDS 帮助文档入口:https://support.huaweicloud.com/rds/index.html
-
11874 【下午茶时光——业界热点陪你喝咖啡】 写代码爽过打游戏!我们来聊聊MySQL的创始人 编者按:根据StackOverflow的最新调查,MySQL仍然是全世界最流行的数据库,受访的开发者中有44.3%的人在使用,超过了第二位的SQL Server 10多个百分点。可是你知道MySQL是怎么诞生的吗?openocean的一篇有关MySQL开发者Michael “Monty” Widenius的传记为我们揭秘。 11875 大学计算机专业的数量总是会随着技术公司的兴衰而起伏,而现在,计算机科学正处在全盛时期。这意味着,不管怎样,计算机科学专业的毕业生绝大部分可能都会去敲2年的代码,再转到产品管理,然后过渡到企业、创业或者商学院,接着再转为既有公司的中层管理,32岁的时候结婚,有了2个孩子,一个儿子,一个女儿,一条狗,还有一栋2层的漂亮房子。对于大多数人来说,成为程序员就是一份朝九晚五的工作,一份有保障的6位数薪水来偿还高昂的学费,一种达到目的的手段,没人应该为此受到责备。但对于千千万万无论好坏的程序员来说,只有一个MontyWidenius。 Monty是一位编程天才。19岁的时候,他从赫尔辛基理工大学辍学开始全职工作,因为大学已经没有什么东西可以教他了。在独自一人写完除了一个库以外的全部代码之后,33岁时,他发布了MySQL,后来后者成为了全世界最流行的开源数据库。55岁时,他藐视着对老年人的歧视,仍然是自己公司最好的程序员。 Monty1962年出生于赫尔辛基,1978年他用暑假铺沥青挣来的钱买下自己的第一台个人计算机的。Monty迅速意识到自己相当擅长写代码——对于别人来说很复杂的事情他却觉得很简单,而且他对工作非常投入。Monty用一种在讲瑞典语的芬兰人中常见的浓厚口音说:“基本上这就像是在阅读一本真的非常非常好的书。或者像在玩视频游戏。你知道开始玩游戏然后嘣一声3小时的时间就过去了的那种感觉吗?写代码对我来说就是这种感觉。” 11876 当别人跑去聚会的时候,Monty却呆在家里编程。他把计算机从里到外都摸透了。他把BASIC的能力推到了极限。Monty说:“学校并不理解编程不是像语言或者历史这样的东西,它不是靠学就能学来的。所以学校是不够的。拔尖的黑客是万里挑一。他们奉献了所有能用的时间,10小时,16小时,每一天,年复一年周而复始。大多数人都不愿意做这样的事情。大多数人宁愿好好生活。”在Monty眼里,好的代码是写过一次就永远不需要再碰的那种。从性能角度来看它已经是最优化了,你可以不断增强,但永远都不需要重写。 到1980年,17岁的Monty痴迷编程已经无法自拔,他需要把自己计算机的内存从8KB扩到16KB。由于芬兰没有商店卖他想要的东西,于是他弄了一条船去到瑞典AllanLarsson的计算机商店。通过Allan,Monty结识了DavidAxmark,三人沟通交流了多年,就各自项目互相帮忙,偶尔也会一起协作。1995年,他们一起成立了MySQL AB。Monty负责编程,David和Allan负责干完其他的事情。自1981年以来,Monty就一直以芬兰公司Tapio Laakso Oy程序员的身份在写MySQL前身的代码,他和Allan一起创办的数据仓库公司也要用到那个东西。然而,知道1995年,在Allan和David的游说之后Monty才决定在他写的东西之上增加一个SQL层。1996年10月,MySQL终于发布了,它得到了广泛的欢迎。MySQL快速、可靠并且易学,这主要是因为在多年的开发中Monty总是不断把正是客户的反馈整合进来。 MySQL的初衷是存储和管理大数据。如果有人想要跟踪不同的数据点,他们互使用数据库,也就是有点像微软Excel那样的东西。然而,随着数据变得越来越大,查找Excel这样的数据库就会变得慢多了,也不再可靠。MySQL有能力存储大量数据,并且返回搜索结果极其迅速。“My”来自Monty女儿的名字,而“SQL”就是结构化查询语言(StructuredQuery Language)的意思,是一种跟数据库沟通的语言。 11877 对MySQL开源的决定出自1985年的另一次芬兰到瑞典的乘船旅行,这一次是在一场开源大会上。Monty说:“讨论没花多少分钟。我们都希望回馈给开源社区一点东西。哪怕有人想拷贝或者偷盗我们的代码,我们认为自己能挣的钱也不会比现在少。”开源项目使得开发者社区帮助把软件做得更好,但从商业角度来看不好的是货币化就要困难多了。为了避免这一点,Monty补充了一个条款,那就是如果任何企业用MySQL来赚钱的话,就需要付费授权。对此MySQL的代码里面并没有进行任何限制,但就靠这一荣誉制度MySQL实现了扩张并开始赚钱。Monty说:“我认为开源是开发软件的更好方式。但你仍然需要赚够钱来招聘员工,成立公司去跟闭源社区竞争。MySQL是第一款做到这一点的产品。” Monty在MySQL AB的职位是CTO,对于大多数成熟的公司来说,CTO其实已经很少再编程的了。然而,Monty从未停下来过,他的绝大部分时间都是在写代码。这种(很少管理的)做法会导致很多晚期阶段初创企业内爆,但哪怕公司人数已经达到550人,Monty在MySQL AB建立的独特文化也使得他可以避免天天开会的烦扰(事实上,Monty甚至都不接受议事日程邀请)。Monty说:“我总是招会自动驾驶的人进来。所以我不需要告诉他们太多东西。而开源意味着你有开源社区,大家会给你提供代码,你可以看看那些代码的质量,看看他们是怎么跟社区互动的,跟你是怎么沟通的,他们会问什么问题,在这些情况下很容易就能看出一个人是好是坏。在一次面试里面是很难了解清楚编码者有多好的。” MySQL的成功是CTO Monty与CEO Mårten Mickos通力协作的结果。两人能力都很强且对公司非常重要,但方式不一样。Monty是技术专家,专注于员工生产出尽量完美的代码。Mårten是公司建设者,专注于交付东西并帮助团队发展。正是两人的联合愿景制造出了MySQL。但在一家没有免费洗衣、免费午餐、站立办公桌的公司里,是Monty的个人魅力吸引住了变成人才。Monty不是好交际的筹资人,讨好别人的人,博弈论大师,或者职业沟通者。他会写代码,而且写得很好。在Monty看来赢得开发者尊重是很简单的事情:“你干的是跟他们一样的事,而且干得更好。” Monty给程序员的建议是,参与到开源社区去,花些时间到个人项目里面(“这些年来我开发了成百上千个程序:MySQL是其中被用得最多的一个,但其他的都只有我自己用。”)。他警告说,改变环境和代码库将意味着哪怕是最好的程序员也要去了解一堆的东西。在Sun被Oracle收购之后,Monty成立了MariaDB,这是MySQL的一个社区版的分支,开发的团队成员很多都是MySQL团队里面的,使用的也是一样的官方语言:“蹩脚的英语”。MySQL的许多热心的开源信徒跟着Monty去到了MariaDB。MariaDB更加面向开发者,允许由外人打补丁这样的事情发生,在很多Linux发行版中它都是默认的数据库。 Monty对开源和开发者的承诺是坚定的——OpenOcean原先是Monty用自己在MySQL的所得成立的,使命是投身于开发者驱动、有技术深度的产品。他仍然在赫尔辛基自己家中主持开发者午餐,很快OpenOcean就将推出一个Slack频道让开发者可以直接向Monty提问。在几十年的时间里,Monty对塑造开源社区无私的形象做出的贡献无可争议的。但这里面大部分的功劳都应该归到成千上万无名的程序员和黑客身上,是他们投入的时间和能力造就了开源的繁荣,也是这批人才能确保开源革命的继续。 原文:https://blog.openocean.vc/founder-stories-a-hackers-hacker-6d5054c90564译文:http://36kr.com/p/5090841.html
-
本帖最后由 tony 于 2018-1-19 15:52 编辑MySQL是世界上最流行的开源数据库,集可靠、易用、功能丰富、适用范围广等特点于一身,尤其对开发者友好,使其成为华为云关系型数据库(RDS)用户的首选。尽管MySQL备受关注,更是各种应用的第一选择,但也面临着诸多挑战,其社区版在云上和线下技术局限性会造成一定的影响,难以完全满足用户的需求。现由华为云RDS团队自研的HWSQL即将公测。那么,华为云RDS的明星产品HWSQL---卓越的云上MySQL,到底解决了哪些难题?技术上又有哪些突破?华为云RDS通常来说,在生产环境中,管理员采用集群部署MySQL来保证服务可用性并提高性能。尽管MySQL易用性极高,但配置高可用数据库集群仍是一个艰巨的任务。在线下或者在IaaS上部署MySQL,用户需要花时间了解MySQL的复制机制,比如配置主备实例、只读副本,浮动IP地址等。同时,他们还需要特别关注诸如安全和备份策略等问题。这使得他们将在这方面耗费大量的时间和精力。现在,再也不用担心这些问题了。华为云RDS以用户需求为导向,从用户体验出发,真正解决用户的痛点,避免了这些繁琐的流程。现在,用户只需访问华为云官网,有针对性的选择与之相适应的实例规格类型,仅需回答几个与网络、数据库配置、备份策略相关的问题,即可在最短的时间内获得一个可用数据库。RDS for MySQL是一个完全托管的在线WEB服务,所有配置皆可通过console或RDS API完成。同时,还可以通过IP地址和端口等采用加密连接的方式访问RDS服务。可靠可扩展 备份故障不用愁华为云RDS可自动安装,是基于最佳实践来部署MySQL集群。不仅数据库的安全性极高,还能定期进行备份,并可轻松完成一定范围内的软硬件故障恢复,数据库管理员再也不用为备份和故障发愁了。图 1: 华为云RDS for MySQL注:图1是典型的RDS for MySQL部署示例。MySQL运行在ECS上,其数量取决于RDS的部署方式。通常包含一个MySQL主实例、一个备实例和最多五个只读副本为查询密集型的应用增加吞吐量和可扩展性。MySQL中库表数据存放在可靠的华为块存储云硬盘(EVS)中。EVS提供三副本,增加数据可靠性。RDS服务支持手动和自动数据库备份,数据库备份存储在低成本的对象存储服务(OBS)中以确保数据库是可恢复的,防止软件错误、人为错误、或恶意活动等。整个环境监控采用华为云监控服务(CES),主动通知RDS环境相关的任何问题。开源MySQL面临的挑战高并发场景下性能差MySQL社区版中,使用InnoDB作为存储引擎,不论是云上还是线下,用户都会面临一些挑战。当活跃的数据库连接数过多(一般情况下,连接数大于500),性能将变差,可能会造成查询响应缓慢。尤其是MySQL5.6,并发连接数太多会直接影响数据库性能。即便采用更高规格的实例也解决不了这个问题,根本原因在于MySQL社区版处理线程的方式。当并发连接增多,锁和资源争用问题会导致性能降低。复制延迟突出开源MySQL面临的第二个挑战是复制延迟问题。在关系型数据库中,数据库的更新操作会被同步写入事件日志以保证其可恢复。在MySQL中,这种日志叫二进制日志(或“Binlog”),使用二进制日志能保证故障场景下事务可恢复。例如,若需要将一个旧的数据库备份恢复到最新状态,管理员可以重放二进制日志中的事务。在MySQL数据库中,备库、只读副本与主库之间的同步是依靠二进制日志重放来实现的。在MySQL5.7以前都没有实现真正的多线程复制,导致从库的复制延迟问题很突出。故障恢复时间长主实例高负荷的情况下,备实例的复制可能会滞后。如图2所示,备实例的事务处理能力远远落后于主实例,导致事务积压。图2 RDS for MySQL主备库TPS和复制延迟情况注:通过开启半同步复制并运行SysBench 0.5压测, 在MySQL5.6.36上获取到如图2所示的结果。该场景包括MySQL主实例和备实例,规格均为32 v CPUs, 128GB, 客户端采用华为云标准的8 v CPUs,32GB VM。测试的数据库大小是1.5GB,包含64个表,每个表100000行。在标准SysBench压测中,读操作(查询)与写操作(**,刷新,删除)的比例是14:4。如上图红线所示,在有负载的场景下,主实例能每秒处理大约1200个事务(每秒22,000次查询)。不幸的是,备实例收集和执行binary日志中事务的速度较慢,处理事务能力远落后于主实例,每秒只能复制和确认200多个事务。高负荷的情况越持久,事务积压越严重,故障情况下恢复所需的时间越长。在上面的示例中,如果主实例在 1,000秒之后故障,备实例要花费大约750秒(12分多钟),去重放落后的日志,故障恢复时间因此变得很长。华为云RDS for HWSQL尽管并不是所有的环境都存在这个问题,但是对于事务繁忙且对故障恢复时间有要求的数据库来说,上面描述的问题可能是个很大的挑战。幸运的是,华为云RDS for HWSQL服务为大型生产数据库解决了这些问题和其他挑战。HWSQL是高性能、100%兼容MySQL、由华为自研的数据库服务。不仅具备RDS for MySQL的所有特性,同时提供更多功能:· 事务吞吐量约为MySQL社区版的3倍,支持更多的用户连接,同时不影响响应速度。· 解决并发连接带来的挑战,即使高达8000并发连接,查询性能依旧良好。· 采用更快、更可靠、无损的半同步复制协议,即使在超高负荷的情况下,也能保证故障快速恢复。· 充分利用大规格实例的资源,发挥强大 HWSQL数据库引擎的优越性能和可扩展性。采用图1中相同的硬件,相同的SysBench模型进行性能压测之后, RDS for HWSQL明显优于开源MySQL,吞吐量是MySQL社区版本的三倍。在sysbench压测中,每个事务包括18个离散查询,不论数据库连接数有多少, RDS for HWSQL的事务吞吐量达到90000QPS(或者5000TPS),并且时延很低。图3 - 华为云RDS for HWSQL与MySQL性能压测对比注:图3是使用sysbench0.5对多个数据库引擎压测获取的测试结果。该场景包括MySQL主实例和备实例,规格均为32 v CPUs, 128GB, 客户端采用华为云标准的8 v CPUs,32GB VM。测试的数据库大小为150GB,包含64个表,每个表10000000行。对DBA来说,情况变得明朗。采用上面相同的高负荷环境测试RDS for HWSQL性能。复制到备实例的速度相当快,备实例基本上与主实例保持同步。如果主实例故障,快速复制可以保障备实例立即恢复操作,减少停机时间,提高业务可用性。同时,RDS for HWSQL采用优化的半同步复制协议来保证数据不仅写入而且提交到副本上,进一步提高可靠性。RDS for HWSQL减少主实例与备实例或者只读副本的延迟,即使在高吞吐量的环境下,也能保证恢复快速无损。从下面图4不难看出,使用HWSQL可大幅降低复制延迟。图4: 华为云RDS for HWSQL的复制延迟情况卓越的RDS云服务HWSQL除了以上特性外,还在诸多方面有所突破,比如:· 强大的线程池插件支持高并发连接· 事务级MTS并行复制可降低复制时间,快速恢复服务,保证只读副本的数据与主库一致· 优化的半同步协议确保数据完整性· 多个只读事务优化· 写事务和日志优化IT优选——HWSQL 值得拥有可以说,数据库是大部分在线应用和服务的核心,同时也对企业的发展作用巨大。而数据库的完整性、可用性及恢复时间,都将直接影响数据库管理员及业务人员的工作成效,因而它们是IT和业务人员关注的焦点。如果还在为工作流烦恼,如果还在为低效率担心,如果还在为性能担忧,那么不妨选择性能一流、可靠性、可用性,且易于部署和管理的RDS for HWSQL。实力派RDS for HWSQL非常值得一试。云数据库HWSQL 即将公测,敬请期待:http://www.huaweicloud.com/product/hwsql.html
-
MySQL中,当参数lower_case_table_names为0时,数据库名和表名都是严格区分大小写的。这在很多情况下并不合适,尤其对应用程序而言。如果直接把参数lower_case_table_names的值修改为1, 会报表或者库不存在的错误,导致应用报错和mysql复制中断。 环境信息如下: 由以上信息可知,库名(huawei)为小写,表名(LWT)为大写,库中除了表没有其他对象。这种场景,库名和表名都需要修改,再修改参数,最后重启数据库。 步骤一:停掉该实例承载的所有应用业务步骤二:创建一个新的数据库(库名为小写)步骤三:修改表名步骤四:数据核对一致后,删除大写库HUAWEI步骤五:修改参数lower_case_table_names在mysql参数文件my.cnf中,修改lower_case_table_names为1。如果使用的是华为云rds mysql,在console端修改该实例使用的参数组即可。步骤六:重启数据库集群,包括主备库和只读副本步骤七:查看主备复制情况mysql> show slave status\G 步骤八:启动业务并验证
-
本帖最后由 小驴涛咪 于 2018-1-3 15:18 编辑MySQL中,参数lower_case_table_names为0时,数据库名和表名都是严格区分大小写的。这在很多情况下并不合适,尤其对应用程序而言增加了编码复杂度。如果直接把参数lower_case_table_names的值修改为1, 会报表或者库不存在的错误,导致应用报错和mysql复制中断。 环境信息如下: 由以上信息可知,库名(huawei)为小写,表名(LWT)为大写,库中除了表没有其他对象。这种场景最简单,只需要修改表名为小写,再修改参数,最后重启数据库即可。正确的修改步骤如下:步骤一:停掉该实例承载的所有应用业务步骤二:修改表名为小写 步骤三:修改参数lower_case_table_names在mysql参数文件my.cnf中,修改lower_case_table_names为1。 如果使用的是华为云rds mysql,在console端修改该实例使用的参数组即可。 步骤四:重启数据库集群,包括主备库和只读副本 步骤五:查看主备复制情况mysql> show slave status\G 步骤六:启动业务并验证
-
MySQL慢查询相关的参数解析 slow_query_log:是否开启慢查询,0或者OFF为关闭,1或者ON为开启,默认值为OFF,即为关闭 强烈建议开启慢查询。slow_query_log_file:指定慢查询日志存放路径 long_query_time:大于等于此时间记录慢查询日志,精度可达微秒级别,默认为10s。当设置为0时表示记录所有查询记录。建议设置为1s。注意:锁等待时间并不计算在执行时间内。log_queries_not_using_indexes:是否记录未使用索引的查询,默认OFF log_throttle_queries_not_using_indexes:每分钟允许写入到慢查询日志的未使用索引的语句,,默认为0,无限制 log_slow_admin_statements:是否记录管理类指令(DDL),默认为OFF
-
rds Mysql开启了GTID的复制模式,GTID的限制就是不允许在事务中(包括在函数和触发器的事务)创建、删除临时表,不论版本是5.6还是5.7,这是mysql本身的限制。事务之外创建、删除临时表是没有问题的,不论版本是5.6还是5.7。mysql>show variables like '%gtid%';+---------------------------------+-------------+----------------+|Variable_name |Value |+---------------------------------+-------------+----------------+|binlog_gtid_simple_recovery | OFF ||enforce_gtid_consistency |ON ||gtid_mode | ON ||gtid_next | AUTOMATIC ||simplified_binlog_gtid_recovery |OFF |+---------------------------------+--------------+----------------+ 隐式事务中创建临时表:没问题mysql> use testDatabase changedmysql> create temporary table t1 (id int);Query OK, 0 rows affected (0.02 sec) 显示事务中创建临时表:报错5.6报错:mysql> begin;Query OK, 0 rows affected (0.01 sec) mysql> create temporary table temp_1 (idint );ERROR 1787 (HY000): When@@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, the statements CREATE TEMPORARY TABLEand DROP TEMPORARY TABLE can be executed in a non-transactional context only,and require that AUTOCOMMIT = 1. These statements are also not allowed in afunction or trigger because functions and triggers are also considered to bemulti-statement transactions. 5.7报错:mysql> begin;Query OK, 0 rows affected (0.00 sec) mysql> create temporary table temp_1 (idint );ERROR 1787 (HY000): Statement violates GTIDconsistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only beexecuted outside transactional context. These statements are also not allowed in a function or trigger becausefunctions and triggers are also considered to be multi-statement transactions. 解决办法:将临时表的创建和删除操作放在事务外,并且保证会话是自动提交的。
-
mysql如何像oracle关闭监听那样禁用客户端的TCP连接呢?在维护数据库时,为了数据的一致性,如何禁止mysql客户端通过TCP的方式连接数据库呢?其实很简单,只需要开启一个参数--skip-networking。这是静态参数,修改后需要重启数据库。开启这个参数后,mysql数据库仅允许本地非TCP类型的连接访问数据库。 步骤一:修改mysql参数文件,在mysqld下添加如下配置:skip-networking=ON注:使用mysql –help|grep my.cnf名称查找mysql正在使用的参数文件步骤二:重启mysql服务,service mysql restart或者/etc/init.d/mysql restart注:mysql为启动脚本的名称,根据实际情况修改步骤三:登录数据库所在主机,通过本地socket方式登录数据库。mysql –u[username] -p[password] 步骤四:验证TCP连接,如下图TCP的连接已经无法访问数据库。注意事项:该参数启用后,mysql复制的IO线程会处于connecting状态。维护结束后(skip-networking恢复为原值OFF),检查slave复制状态,如果IO线程仍处于connecting状态,需重启slave。
-
问题描述我们在对数据库进行性能测试的时候最常用到的测试工具是sysbench,这款工具功能强大,已经成为业界测试主流数据库性能的标准,目前用sysbench测试的时候采用的测试数据量一般是64张表,每张表10000000笔数据,这个数据量大概有150GB,一般情况下这些数据是用sysbench的prepare参数通过oltp.lua脚本一条一条的生成随机数据,再一条一条的**到数据库中,这个准备过程类似于重复的**单条数据到数据库,所以比较慢,正常情况下准备64张表,每表1000W笔数据需要10几个小时,即使是SSD磁盘也需要4个小时,这个过程漫长,浪费时间,对于经常需要做性能测试的人来说不可忍受。需求描述也许是sysbench工具在设计的时候考虑到各个数据库的通用性,才没有考虑装载数据比较慢的问题,不过sysbench提供了强大大lua自定义接口,针对以上装载数据慢的问题,已经有人发布了oracle和PostgreSQL快速**数据方法,了解到oracle用的sqlldr,PG用的也是类似的方法,不过都需要有客户端来完成数据装载,这种方法是利用工具先生成需要**的数据,然后批量装载到数据库,这样,比一条一条的生成、**数据会快很多,MySQL的LOAD DATA INFILE类似于这种方式,我们可以设计sysbench提供的lua接口,实现一个lua脚本,通过load data infile的方式来加速数据装载。原理介绍在使用sysbench测试数据库性能的时候,最常用到的两个命令是参数是prepare和run,分别对应于数据准备和测试执行,prepare阶段使用单线程来**数据,效率低下,例如,以下命令是用prepare的方式单线程执行oltp.lua来**数据sysbench–test=./sysbench/tests/db/oltp.lua--oltp-tables-count=64--oltp-table-size=10000000--mysql-host=xx.xx.xx.xx--mysql-port=xxxx--mysql-db=testdbx--mysql-user=root--mysql-password=xxxxxxprepare而run的方式是可以指定并行参数多线程并发来执行,例如,在执行阶段,sysbench产生了32个线程来执行测试任务。sysbench--test=./sysbench/tests/db/xxx.lua--oltp-tables-count=64--oltp-table-size=10000000--mysql-host=xx.xx.xx.xx--mysql-port=xxxx--mysql-db=testdbx--mysql-user=root--mysql-password=xxxxxx--num-threads=32run那么,我们为什么不用run的方式来并行造数据呢,这样,我们就可以并行执行MySQL load data infile以加速数据的加载。用这种方式,只需实现一个生成原始数据的工具,再实现一个lua脚本用来加载数据就可以了。数据的生成Sysbench的表结构比较简单,数据的生成主要是生成随机数,这里为了提高效率,采用c语言来完成数据生成的代码。代码保存为gendata.c编译上面c语言的方式如下:gccgendata.c-ogendata生成gendata可执行文件后,执行gendata加上要生成的数据量,就可以生成需要的数据了,例如:./gendata21,0,89972079288-04286136280-27548240250-91378609072-62125630986-31031597636-48809504488-66368343240-64737407520-08070207568,16823019800-26761011658-25884599296-42689212400-647026659502,2,98945650624-93173592422-60892765221-01539165792-94510835936-02724198826-08373766004-71825491844-16642099974-59473284405,76897098852-02055441101-97671756059-41804656608-33688540610这样就生成了两笔数据可以通过重定向将数据输出到文件里,例如,以下方式生成1000W笔数据,并保存到testdb1.dat中:./gendata10000000>testdb1.dat实际测试生成1000W笔数据只需30秒左右。数据加载脚本的设计数据加载使用sysbench提供的lua接口来实现,这里实现了一个可以使用mysql load data infile方式加载数据的lua脚本脚本保存为loaddata.lua并放在. /sysbench/tests/db/目录下脚本中会自动调用gendata工具生成数据文件,然后用并行的方式将文件加载到数据库中。测试与验证加载数据使用sysbench run的方式启动多个线程来并行执行loaddata.lua脚本,例如:sysbench--test=./sysbench/tests/db/loaddata.lua--oltp-tables-count=64--oltp-table-size=100000000--mysql-host=xx.xx.xx.xx--mysql-port=xxxx--mysql-db=testdbx--mysql-user=root--mysql-password=xxxx--num-threads=4run实际测试中发现同样的测试环境这种方式会比sysbench的方式快10倍左右,在数据加载的过程中磁盘性能会成为瓶颈,磁盘性能越高,加载越快。
-
1 介绍MySQL 提供了异步复制,主库并不关心备库是否收到日志,从而可能导致较多的数据丢失。从MySQL5.5开始引入了一种半同步复制功能,该功能可以确保主服务器和至少一台从服务器之间的数据一致性和冗余,从而可以减少数据的丢失。1.1 异步复制 master将binlog event发送给slave后,不去确认slave是否已经收到就返回成功给客户端。80301.2 半同步复制 master将binlog event发送给slave后,确认slave已经收到时才返回成功给客户端。 80312 半同步复制演进2.1 减少LOCK_log锁冲突在MySQL5.7.2版本中重构DUMP线程减小了LOCK_log锁冲突。 在之前版本中,写binlog的设计为先持有LOCK_log锁(锁住了整个binlog文件),写完后释放锁,再发送binlog更新信号。DUMP线程在读取binlog内容时,也要先获取到LOCK_log锁,然后读取binlog内容,然后释放锁。这样当写binlog的线程和DUMP线程在处理同一个binlog时,就会有较严重的冲突。 在MySQL5.7中调整了这块的设计。因为写binlog时是追加写入,DUMP线程只是读取,这样可以用一个变量(binlog_end)记录binlog文件末尾位置,每次追加写入后更新下这个变量就可以(用lock_binlog_end锁保护变量binlog_end),DUMP线程在读取时只要不超过标记的binlog末尾位置就可以。只需要在读取到末尾位置时,获取下lock_binlog_end锁,获取下最新的末尾位置。2.2 半同步复制等待点调整 在MySQL5.6版本中,master将每个事物写入binlog传递到slave刷新到磁盘(relay log),同时主库提交事务。master等待slave 反馈收到relay log,只有收到ACK后master才将commit OK结果反馈给客户端。 这样主库返回给客户端commit ok前,可能事物已经真正提交了,但是从库还没有收到日志。这时其他客户端已经可以看到了提交的事物,这时如果主库故障,主备切换后,其他客户端发现刚才提交的事物又消失了。 为了解决这个问题MySQL在5.7.2中有了一个解决方案” transaction loss-less”.具体逻辑为master将每个事务写入binlog , 传递到slave刷新到磁盘(relay log)。master等待slave反馈接收到relay log的ack之后,再提交事务并且返回commit OK结果给客户端。即使主库crash,所有在主库上已经提交的事务都能保证已经同步到slave的relay log中。同时引入了参数rpl_semi_sync_master_wait_point来控制使用的策略,默认值为AFTER_SYNC,即5.7的改进做法,还有一个可选值为AFTER_COMMIT,即5.6中的策略。MySQL5.6处理逻辑图:8032MySQL5.7.2处理逻辑图:80332.3 独立线程处理ACKMySQL5.6的semi sync 受限于dump thread,原因是dump thread 承担了两份不同且又十分频繁的任务:传送binlog给slave ,还需要等待slave反馈信息,而且这两个任务是串行的,dump thread 必须等待 slave 返回之后才会传送下一个 events 事务。dump thread 已然成为整个半同步提高性能的瓶颈。在高并发业务场景下,这样的机制会影响数据库整体的TPS 。8034为了解决上述问题,在5.7.4版本的semi sync框架中,独立出一个 ack collector thread ,专门用于接收slave的反馈信息。这样master 上有两个线程独立工作,可以同时发送binlog 到slave ,和接收slave的反馈。80352.4 master支持等待多个slave在MySQL5.6中当半同步开启时,master只是保证一个slave接收到日志,这样当在一主多从的场景下,master和接收到最新日志的slave都挂掉了,那就会丢失数据。这样增加多个备库也不会提高HA的可用性。在MySQL5.7.3中新增了参数rpl_semi_sync_master_wait_slave_count,可以用来控制master需要保证多少个slave接收到日志。
-
大家下午好,先做一个简单的调查,看看在座的各位有没有接触MySQL,有接触过的举一下手,看样子大部分都是接触过或者用过MySQL,也应了那句话MySQL是全球最流行的开元数据库所言非虚。刚才产品架构师讲的主要是华为云数据库的前沿技术,我作为产品经理主要是从客户的角度来分享一下客户的实践案例。华为云数据库的功能特别多,应用的场景也不少,不可能把所有的场景一一展示出来,这里拿出一个典刑的场景进行分享。上图是华为云数据库,通常称为RDS的简单示意图,比较直观、全面的展示了RDS主要的功能,可以看一下图的左边,包括了实例管理、实例访问、备份与恢复、实例监控、弹性伸缩、日志管理、参数配置等等功能。也就是说客户自己在线下搭建数据库遇到的一些问题,基本上RDS都帮用户服务化实现了。看一下右上角这块双机热备高可用,这是RDS主要的架构,和大多数云厂商一样,RDS也是采用这种双机热备高可用,当主实例发生故障时候,可以自动切换到备实例,备实例自动升主。如果应用程序流量很大,尤其是读流量很大的时候,可以创建只读实例,目前最高创建5个只读实例来承担读流量。刚才讲过主实例宕机以后会切换到备实例,那么这些只读实例怎么办?RDS会自动去维护主从复制关系,会把所有的只读实例全部挂到备实例(新主)上面去。在MySQL这个领域里面,主备实例之间和主实例与只读实例之间都是通过MySQL复制的技术来建立复制关系、数据同步的。但是现在RDS有一个不足的地方,主备实例对外呈现的是一个IP地址,每一个只读实例呈现出来的都是单独的IP地址,那么给客户应用带来一个负担,也就是需要应用程序去决定到底是读写主备库,还是去读只读实例。客户也会经常提到这样的问题,问RDS有没有读写分离的解决方案。如上图所示,有些客户不了解华为云有专门的读写分离解决方案,于是客户就使用HAproxy自己来搭建。都知道这个HAproxy主要的功能就是负载均衡的,虽然它没有读写分离的功能,那么就想出了左图这样的架构图来做,也就是说应用程序读写主库,然后HAproxy提供一个IP,专门去读只读实例集,由HAproxy做一个负载均衡。这在某种程度上解决了客户的问题。那么这样做有几个缺点,1、HAproxy需要维护高可用,它自己的单点的问题不好解决,整个的搭建其实也挺复杂,虽然HAproxy使用挺简单,但对客户来说安装、部署、运维还是挺复杂的,2、应用程序没有一个唯一的连接地址,它需要应用程序去识别是读写主备实例,还是去读只读实例,那来看看华为云的解决方案。如上图的右边所示,华为云有一个专门的组件或者服务,叫DDM(分布式数据库中间件),DDM的主要功能是用来做分库分表的,但也有一个附带的功能就是读写分离。引入了DDM以后,比较好的解决了刚才上述碰到的一些问题,DDM是由专门的团队去负责的,运维、部署、高可用不用客户去操心;第二个最大的优点应用程序再也不用应用去识别是读写主备实例,还是读写只读实例,也就是做到了真正的读写分离。对于该解决方案,有实际的案例,我们来看一下。这是一个客户案例,左边是架构图,红色框就是DDM和RDS。该业务特点就是互联网领域初创型公司遇到的最典型场景,读写比较高(8:2),单独的一个主库压力是比较大的,另外,IT运维比较弱,采用我们这个解决方案以后,不仅仅是使用了我们华为的RDS和DDM,实际上是使用了一整套的华为云服务,包括其他的服务也是有的。使用了该解决方案以后,系统稳定性大幅度提升,运维成本降低了70%,人工成本降低了50%。讲了这么多,这个东西会不会很复杂?因为云服务典型特点就是只要在console上点击几下鼠标,或者调用API就可以轻松部署,所以使用起来非常简单。部署这样的解决方案大体上是分为6个步骤,听起来很多,实际上是很简单的,1、购买RDS主备实例和只读实例;2、购买数据库中间件实例;3、导入实例;4、同步只读副本(可选),5、创建逻辑库。整个步骤都仅仅需要点击鼠标,或者调用OpenAPI来完成,完成以后就会提供唯一的读写分离访问地址。最后欢迎大家来体验RDS和DDM,谢谢大家。
-
很多客户对于华为云数据库还不是太了解,或者在使用华为云数据库的时候存在一些疑虑。这里会针对几个重要的特性进行demo展示。一、创建跨AZ的主备实例进入console以后,点击“购买数据库实例”,如果想部署主备实例,需要打开“HA”选择,然后根据业务特点选择同步模型。如果选择的“主可用区”和“辅助可用区”不同的话,就可以实现跨AZ主备高可用了,如下图所示。二、VPC、公网访问RDS实例创建好了实例以后,可以通过两种方式访问RDS实例,一种是通过VPC内,这个一般使用VPC内的私有IP;另一种就是通过公网IP访问。VPC内连接实例:以SSL连接为例,请确认先申请了台带公网IP的ECS,然后安装了mysql客户端:1. 下载证书文件http://developer.huaweicloud.com/tools/rds.html并将证书文件” ca.pem”上传到ECS上2. 连接RDS实例3. 然后就可以进行一些数据库表的增删改查等操作。公网IP访问,使用常见的Navicate for mysql1. 打开Navicat for MySQL2. 新建连接3. 然后就可以操作数据库了很多客户提出一个疑问:华为云数据库中能否设置IP白名单。实际上华为云有VPC安全组的功能,比白名单更先进更好用。打开VPC的控制台,可以在安全组中设置各种访问规则,如下图所示。RDS可以设置自己的单独的安全组,以实现对各种IP、端口的限制访问。三、恢复到指定时间点在什么情况下用户会用到这个功能呢?最典型的场景是应用程序或者操作人员,无意中把某个表或者数据库删掉了,需要找回数据的时候,就需要用到PITR的功能。前提是要把备份打开,华为云数据库提供了两个恢复方式,一个是恢复到新实例,第二个会完全覆盖当前实例。如下图所示。四、实例配置变更(CPU/内存、磁盘、参数)接下来是大家最为关心的华为云数据库的弹性伸缩。当业务发展后,发现当前的实例配置已经无法满足要求时,或者存储容量要求变大后,都可以进行在线的配置变更。如下图所示。特别要提出的是,华为云数据库采用了参数组的概念,自带了多个以default开头的参数组,这些参数组只能查看参数,不能修改。如果需要修改某个参数值,需要先创建自己的参数组,然后修改参数值,再变更实例的参数组,如下图所示。五、创建只读副本可以通过创建只读副本(目前最多能创建5个只读副本)来扩展读流量。点击”RDS实例管理“ -> “更多” -> “创建只读副本” ,如下图所示。六、从零开始搭建Discuz网站接下来我们玩一个小游戏,从零开始,看看如何快速的使用华为云的相关服务来搭建一个网站。主要过程如下:a. 准备工作确保已经下载了Discuz_X3.2_SC_UTF8.zip文件b. 开始搭建c. 访问论坛网站a. 有关数据库的配置b. 发帖后查询数据库整个过程也就10多分钟就可以搭建一个论坛了,非常方便快捷。
-
使用mysqldump将本地数据导出,导入rds MySQL时。导入过程中可能会遇到以下错误:ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER privilege(s) for this operation1.问题原因:MySQL导入用户的权限问题。处于安全考虑,rds MySQL的最高权限用户root是没有super权限的,当前自建用户也不能有super权限。但是用户执行导入的sql中,包含需要super权限的语句,所以会报错。如果源库开启了GTID特性,使用mysqldump 导出数据时,没有添加选项--set-gtid-purged=OFF,导出的sql中就有存在以下需要super权限执行的语句:SET @@SESSION.SQL_LOG_BIN= 0;SET @@GLOBAL.GTID_PURGED=´18f9a804-343b-11e5-a21d-b083fed01601:1-2´;2.解决办法办法1:导出语句中添加选项--set-gtid-purged=OFF重新导出,再导入即可。mysqldump -uroot -p -h192.168.0.50 -P8635 --databases test --set-gtid-purged=OFF --master-data=2--single-transaction --order-by-primary -r dump.sql办法2:使用source方式导入,这种方式即使权限问题报错,剩余sql语句仍可继续执行,不影响最终数据。mysql>source /tmp/dump.sql 注意:sql文件的路径和权限
-
很多人认为这个参数是防止暴力破解mysql用户密码的,但是测试过程中发现为什么密码错误次数超过了该参数值,该用户仍然没有出现以下错误,继而被锁定。ERROR 1129(HY000): Host ´10.10.10.10 is blocked because of many connection errors; unblockwith ´mysqladmin flush-hosts´其实是对参数的理解出了偏差,以下为MySQL官网的解释:Ifmore than this many successive connection requests from a host are interruptedwithout a successful connection, the server blocks that host from furtherconnections.如果mysql服务器连续接收到了来自于同一个主机的请求,且这些连续的请求全部都未成功建立连接就被断开了,当这些连续的请求的累计值大于 max_connect_errors的设定值时,mysql服务器就会阻止这台主机后续的所有请求。这个参数指的是网络错误,密码错误并不算在内。 Youcan unblock blocked hosts by flushing the host cache. To do so, issue a FLUSHHOSTS statement or execute a mysqladmin flushhosts command. If a connection isestablished successfully within fewer than max_connect_errors attempts after aprevious connection was interrupted, the error count for the host is cleared tozero.However, once a host is blocked, flushing the host cache is the only wayto unblock it. The default is 100.当遇到主机被阻止的时候,可以清空host cache来解决,执行sql语句 flush hosts或者在mysql服务器的shell里执行 mysqladmin flush-hosts操作。如果该数据库参数host_cache_size为0或者skip-name-resolve为ON,错误ERROR 1129将不会发生。
-
MySQL中大小写规则: 1、数据库名严格区分大小写的; 2、表名是严格区分大小写的; 3、表的别名是严格区分大小写的; 4、列名与列的别名在所有的情况下均是忽略大小写的; 5、变量名也是严格区分大小写的; 6、字段值默认是忽略大小写的; 可通过将参数lower_case_table_names设置为1,忽略数据库名和表名的大小写,即不区分大小写。 强烈建议在实例创建前确定该参数的值,该参数的推荐值为1,以避免迁移上云后的代码改造和逻辑错误。如果是HA实例+只读副本的数据库架构,只读副本该参数需要与主库保持一致,避免复制中断。 如果要忽略字段值的大小写,创建表时需要添加BINARY属性。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签