• [技术干货] 云数据库在水利领域的应用与探索
    随着信息时代的到来,信息技术高速发展,数据互联互通成为必然。传统的数据库已不能够满足海量数据的需求。因此,基于云计算的云数据库技术应运而生。云数据库是指被优化或部署到一个虚拟计算环境中的数据库。与传统的分布式数据库相比,云数据库具有高可扩展性、高可用性、采用多租形式和支持资源有效分发等特点。因此,云数据库是数据库技术的未来发展方向。云数据库应用在水利管理领域,能弥补基层水利管理中信息互通的短板,降低管理投入成本,优化管理结构。当今社会,数据库被广泛应用于生活的各个领域,服务于每个人的衣食住行,推动并见证着社会的文明与发展。随着信息时代的到来,信息技术高速发展,数据互联互通成为必然。传统的分布式数据库已不能够满足需求。海量数据的传输和运算存在瓶颈。至此,一种分布式计算、网络存储、虚拟化计算环境等计算机技术混合演进的网路计算模式,解决了这一难题,它被称之为“云计算”。同时,基于“云计算”算法模式下的云数据库技术,应运而生。1 云数据库的概念和重要意义1.1 云数据库的概念云数据库是指被优化或部署到一个虚拟计算环境中的数据库。与传统的分布式数据库相比,云数据库具有高可扩展性、高可用性、采用多租形式和支持资源有效分发等特点。在实践中能最大限度处理海量数据,满足大数据处理需求。1.2 云数据库技术应用于水利管理领域的意义水利管理领域涉及灌溉、防洪抗旱,水资源管理等方面,从基层灌区站所到区县河道流域,面临着数据更新滞后,信息互通短板,监督存在盲区现象。云数据库的应用,能解决水利管理中海量数据计算存储,增加数据的完整性,实效性,降低水利管理运行成本。综上所述:云数据库应用在水利管理领域,能弥补基层水利管理中信息互通的短板,降低管理投入成本,优化管理结构,解决好水利管理存在中突出的矛盾,对水利事业的发展,具有深远的意义。2 云数据库技术在水利管理中应用2.1 云数据库技术应用于灌溉管理数据系统基层水利管理模式是将灌溉水量的测算,水费征缴,水资源管理分属不同的管理部门,部门之间信息互通有限。建立完整的云数据库系统,以流域为单位,各层级之间设置相应读写权限,最大程度方便各级部门之间的信息互通,节省了管理成本,简化管理程序。2.2 云数据库应用技术于水费征收系统灌区水利站所承担水费征收任务,历来水费征收按照轮次征收,先灌溉,后缴费,致使部分站所水费征收滞后,费用无法按时足额汇缴。加之管理区域较大,用水户缴费存在诸多不便。云数据库通过互联网存储读取数据,使用水户能及时了解所用水量,方便缴纳水费。从而真正扭转基层水利管理落后的局面。3 云数据库技术应用过程中注意问题3.1 云数据库结构层系统体系架构设计云数据库的系统体系架构多种多样,随着水利管理更加精细化管理的趋势,尤其近年来,诸如将地下水超采,作为基层水利管理所重点工作,这就要求云数据库技术打破传统的非关系型数据存储方式,发挥云数据库可扩展分布式关系的优点,对云数据库结构层系统的架构进行深入研究,保证数据存储类型多样,存储结构逻辑清晰。3.2 云数据库算法优化云数据库能够兼顾分布式和动态更新的数据存储方式,能一改树型查找算法和静态查找算法的弊端。通过适合云数据库的确定性算法,保证在有限的组合中,优化问题导向,找到最优解。在灌溉管理中,云数据库能发挥其为其海量信息处理特点, 在设计算法时从水利管理的全局的出发,考虑到网络的流量、拥塞等问题,保证数据存储的时效性。3.3 云数据库安全云数据库应用于水利管理领域,应着重加强安全管理,尤其注重数据库防火墙建设。水利灌溉数据需要评估和划分放置在云端的数据等级,分级对云端的数据进行加密,同时确保数据读写的安全。4 结 论云数据库应用于水利管理领域,将解决水利管理中数据孤立,信息互动,探索云数据库技术在水利灌溉,水情监测等方面的应用,对于推动水利管理向区域化方向发展具有深远的意义。来自:农业信息化 
  • [数据库] 【第42课】RDS for PostgreSQL插件介绍
    本文介绍RDS for PostgreSQL支持的插件及不同插件的创建、删除或使用方法。PostgreSQL插件简介PostgreSQL是开源数据库中经典的大型关系型数据库之一,它不仅具备经典关系型数据库的功能,而且在不断发展。PostgreSQL的发展不仅受到了很多基于PostgreSQL外部应用的影响,而且发展出了更多基于PostgreSQL的应用,例如PostGIS(GIS领域中重要组件)。从技术角度讲,PostGIS是PostgreSQL的一个扩展(extension),即插件。像PostGIS这样的插件已经在计算机相关的领域中都得到不同程度的应用,它成为PostgreSQL功能延展性的主要特点。PostgreSQL插件的功能不仅体现在新增复杂的数据类型、索引等数据的基本功能上,这些基本功能也是GIS领域所特别需要的,并且PostgreSQL的插件可以完成包括分布式、异构数据访问等的各种高级功能。这使得PostgreSQL数据库不仅仅是一个传统的经典关系型数据库,并且通过插件的扩展功能,它完全可以满足今天互联网对于大数据应用的需求。RDS for PostgreSQL插件列表RDS for PostgreSQL和社区版PostgreSQL一样,也支持通过插件,实现更多的扩展功能。当前RDS for PostgreSQL支持的插件如下表所示:插件名称PostgreSQL 9.5PostgreSQL 9.6PostgreSQL 10PostgreSQL 11PostgreSQL 增强版PostgreSQL 12PostgreSQL 13address_standardizer2.5.12.5.12.5.12.5.12.5.13.0.03.1.0address_standardizer_data_us2.5.12.5.12.5.12.5.12.5.13.0.03.1.0amcheck无无无1.11.11.21.2auto_explain2222222bloom无无无1.01.01.01.0btree_gin1.01.01.21.31.31.31.3btree_gist1.11.21.51.51.51.51.5citext1.11.31.41.51.51.61.6cube1.01.21.21.41.41.41.4dblink1.11.21.21.21.21.21.2dict_int1.01.01.01.01.01.01.0dict_xsyn1.01.01.01.01.01.01.0earthdistance1.01.11.11.11.11.11.1fuzzystrmatch1.01.11.11.11.11.11.1hll2.122.122.122.122.122.142.15.1hstore1.31.41.41.51.51.61.7icu无无无1.01.01.01.0intagg1.01.11.11.11.11.11.1intarray1.01.21.21.21.21.21.3isn1.01.11.11.21.21.21.2ltree1.01.11.11.11.11.11.2mysql_fdw无无无2.5.52.5.52.5.52.5.5oracle_fdw无无2.1.02.1.02.1.02.2.02.3.0orafce3.8.03.8.03.8.03.8.003.8.03.14.0pageinspect1.31.51.61.71.71.71.8passwordcheck2222222pg_bigm无无无1.2_202002281.2_202002281.2_202002281.2_20200228pg_buffercache1.11.21.31.31.31.31.3pg_cron无无无无无1.2.01.3.0pg_freespacemap1.01.11.21.21.21.21.2pg_hint_plan1.1.51.2.01.3.01.3.51.3.51.3.71.3.7pg_jieba1.1.01.1.01.1.01.1.01.1.01.1.02.0.1pg_pathman1.5.81.5.81.5.81.5.81.5.81.5.121.5.12pg_prewarm1.01.11.11.21.21.21.2pg_repack1.4.61.4.61.4.61.4.61.4.61.4.61.4.6pg_roaringbitmap无无无0.5.20.5.20.5.20.5.2pg_stat_statements1.31.41.61.61.61.71.8pg_trgm1.11.31.31.41.41.41.5pg_visibility无无无1.21.21.21.2pgcrypto1.21.31.31.31.31.31.3pglogical无无无2.3.32.3.32.3.32.3.3pg_profile_pro无无无无无1.0无pgrouting无无无3.1.03.1.03.1.03.1.3pgrowlocks1.11.21.21.21.21.21.2pg_sql_history1.01.01.01.01.01.01.0pgsql-ogr-fdw无无无1.0.121.0.121.0.121.0.12pgstattuple1.31.41.51.51.51.51.5plpgsql1.01.01.01.01.01.01.0plperl无无无1.01.01.01.0plproxy无无无2.10.02.10.02.10.02.10.0plv8无无无2.3.152.3.152.3.152.3.15postgis2.5.12.5.12.5.12.5.12.5.13.0.03.1.0postgis_raster集成到postgis集成到postgis集成到postgis集成到postgis集成到postgis3.0.03.1.0postgis_sfcgal2.5.12.5.12.5.12.5.12.5.13.0.03.1.0postgis_tiger_geocoder2.5.12.5.12.5.12.5.12.5.13.0.03.1.0postgis_topology2.5.12.5.12.5.12.5.12.5.13.0.03.1.0postgres_fdw1.01.01.01.01.01.01.0postgres-decoderbufs无无无1.3.11.3.11.3.11.3.1postgresql_anonymizer无无无0.7.10.7.10.7.10.7.1q3c无无无2.0.02.0.02.0.02.0.0rum无无无1.3.701.3.71.3.7sslinfo无无无1.21.21.21.2tablefunc1.01.01.01.01.01.01.0tds_fdw无无2.0.12.0.12.0.12.0.12.0.2test_decoding2222222timescaledb01.3.21.3.21.3.21.3.21.7.02.1.0tsm_system_rows1.01.01.01.01.01.01.0tsm_system_time1.01.01.01.01.01.01.0unaccent1.01.11.11.11.11.11.1uuid-ossp1.01.11.11.11.11.11.1wal2json无无无2.32.32.32.3xml2无无无1.11.11.11.1zhparser1.01.01.01.01.01.01.0表中的数据均来源于PostgreSQL引擎各个版本,最新小版本支持的插件列表。您可以通过SELECT name FROM pg_available_extensions;查看当前实例支持的插件列表。如果当前实例的版本不支持某个插件,您可以将当前实例迁移至新版本实例,迁移方法请参考迁移方案概览。使用mysql_fdw、oracle_fdw、pgsql-ogr-fdw、postgres_fdw和tds_fdw等需要跨数据库实例访问的插件时,需确保两个数据库实例的服务端IP必须在同一个VPC和子网内。具有公测权限的用户才可使用RDS for PostgreSQL 13,您可以提交工单申请。创建RDS for PostgreSQL插件RDS for PostgreSQL插件是数据库级生效,并不是全局生效。因此创建插件时需要在业务所在数据库上进行手动创建。RDS for PostgreSQL的以下插件不需要通过手动创建或删除:auto_explainpasswordcheckpg_profile_propg_sql_historyplpgsqlwal2jsontest_decodingRDS for PostgreSQL 11、RDS for PostgreSQL 增强版、RDS for PostgreSQL 12和RDS for PostgreSQL 13的最新小版本,支持以root用户通过社区的方式来创建(create extension)、删除(drop extension)插件。1.  执行如下命令,以root用户连接数据库,以database1为例,并使用模板库template1创建需要支持插件的数据库。# psql --host=RDS_ADDRESS --port=DB_PORT --dbname=database1 --username=root -c "create database DB_NAME template template1;"RDS_ADDRESS为RDS实例的IP地址。DB_PORT为RDS数据库实例的端口。DB_NAME为需要创建插件的数据库名称。回显如下信息,请输入root用户的密码。Password for user root:如果执行操作为:由普通用户user1创建的数据库db1,您需要先使用普通用户user1登录数据库db1(登录方式参考上述内容),然后执行如下命令将数据库db1的权限授予root用户。GRANT ALL ON DATABASE db1 TO root;示例:创建需要支持插件的数据库my_extension_db# psql --host=192.168.6.141 --port=5432 --dbname=database1 --username=root -c "create database my_extension_db template template1;"Password for user root: CREATE DATABASE2.   以root用户连接需要支持插件的数据库,并创建插件。# psql --host=RDS_ADDRESS --port=DB_PORT --dbname=DB_NAME --username=root -c "select control_extension('create','EXTENSION_NAME');"RDS_ADDRESS为RDS实例的IP地址。DB_PORT为RDS数据库实例的端口。DB_NAME为需要创建插件的数据库名称。EXTENSION_NAME为插件名称,请参见上表。回显如下信息,请输入root用户的密码。Password for user root:示例:在数据库my_extension_db中创建postgis插件# psql --host=192.168.6.141 --port=5432 --dbname=my_extension_db --username=root -c "select control_extension('create','postgis');"Password for user root: control_extension ------------------------------ create postgis successfully. (1 row)删除RDS for PostgreSQL插件RDS for PostgreSQL插件是数据库级生效,并不是全局生效。因此创建插件时需要在业务所在数据库上进行手动创建。RDS for PostgreSQL的以下插件不需要通过手动创建或删除:auto_explainpasswordcheckpg_profile_propg_sql_historyplpgsqlwal2jsontest_decodingRDS for PostgreSQL 11、RDS for PostgreSQL 增强版、RDS for PostgreSQL 12和RDS for PostgreSQL 13的最新小版本,支持以root用户通过社区的方式来创建(create extension)、删除(drop extension)插件。执行如下命令,以root用户连接已创建插件的数据库,并删除插件。# psql --host=RDS_ADDRESS --port=DB_PORT --username=root --dbname=DB_NAME -c "select control_extension ('drop','EXTENSION_NAME');"RDS_ADDRESS为RDS实例的IP地址。DB_PORT为RDS数据库实例的端口。DB_NAME为需要创建插件的数据库名称。EXTENSION_NAME为插件名称,请参见上表。回显如下信息,请输入root用户的密码。Password for user root:示例:# psql --host=192.168.6.141 --port=5432 --dbname=my_extension_db --username=root -c "select control_extension('drop','postgis');"Password for user root: control_extension ---------------------------- drop postgis successfully. (1 row)RDS for PostgreSQL插件说明插件名称插件说明postgis创建postgis插件时,会同步创建以下插件:postgis、postgis_topology、fuzzystrmatch、postgis_tiger_geocoder、address_standardizer及address_standardizer_data_us。创建的postgis插件版本如果大于等于3.0.0,创建postgis插件时会同步创建postgis_raster插件。创建postgis插件时,主备实例的主机创建插件后,请先断开备机已经建立的连接,备机需要重新建立连接更新search_path设置。对于PostgreSQL增强版实例,创建postgis插件前,需要在控制台上将实例参数“empty_is_null”设置为“OFF”。plpgsqlplpgsql 1.0插件支持提供SQL过程语言,默认内置安装,无需手动创建该插件。earthdistance安装earthdistance插件前,请先安装cube插件。cube如果已安装earthdistance插件,删除cube插件会导致earthdistance插件不可用。timescaledbRDS for PostgreSQL的timescaledb插件不支持tsl协议的特性,具体如下:add_compress_chunks_policyadd_drop_chunks_policyadd_reorder_policyalter_job_schedulecompress_chunkdecompress_chunkdrop_chunksinterpolatelocfmove_chunkremove_compress_chunks_policyremove_drop_chunks_policyremove_reorder_policyreorder_chunkset_integer_now_functime_bucket_gapfillwal2json该插件是逻辑复制插件,您可以直接使用该插件,不需要通过control_extension安装。pg_profile_pro因发现插件存在缺陷,现暂时关闭支持,我们会在缺陷修复后重新开放,给您造成不便敬请谅解。pg_repackpg_repack可以使用最小的锁资源来重新整理表和索引的物理页面,从而实现物理页面的碎片整理。相较于使用cluster和vacuumn full重写表,pg_repack不需要在整个处理期间持有表级排他锁,因此能提供近似的在线服务。具体操作请参考使用pg_repack插件。
  • [热门活动] 【奖品丰厚】2022HCSD实训营第一期——躬身入局,一览华为云数据库
    !!!重要提示:本帖是副帖,参与活动请前往主帖,在主帖进行回复,副帖回复不参与活动评奖。主帖入口请戳文末链接或二维码↓↓↓在国际局势动荡且数据量指数级暴增的今天,数据库作为IT行业最重要的基础软件,这颗被誉为软件行业的明珠更是愈发重要。本期实训营通过数据库及行业发展趋势、华为云数据库产品的介绍,让大家对数据库有个全局的认知,为国产数据库的崛起培养优秀的人才。HCSD实训营  第一期欢迎来到数据库的世界活动时间:2022/4/15-2022/5/15活动主题:HCSD实训营第一期——躬身入局,一览华为云数据库活动目的:了解华为云数据库,通过理论和实践相结合的方式,让0基础用户,实现技能提升。活动奖品:华为watchGT2e、筋膜枪、华为手环4、罗技键鼠套装、无线鼠标,和盲盒抽奖(U盘、文件收纳袋、笔记本套装、笔记本散热器、电风扇、数据线、冰箱贴等)参与入口:>>>>HCSD实训营  第一期 数据库【注意事项】1.获奖结果将在活动结束后7个工作日内进行公示,请报名和留言的伙伴关注社区内容,所有奖品将在活动结束后15个工作日内发放,有任何问题,请添加小助手微信18209232786。2.活动奖品颜色随机,且部分奖品数量有限发完将用等值奖品代替;另参与人数不能达到最低楼层,不开奖。3.活动参与需遵守《华为社区常规活动规则》;4.为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等**活动公平性的行为),利用资源从事违法违规行为的用户收回抽奖及奖励资格。5.本次活动一个实名认证账号只能对应一个获奖人,如同一账号填写多个不同获奖人,不予发放奖励;6.本活动最终解释权归华为云所有。
  • [活动公告] 【中级体验任务】DevStar 智能OCR图像文字识别 体验活动
    体验形式:本次体验采用有奖征集体验评测报告+群内交流的反馈的形式。我们将在体验官群内(点击链接申请成为体验官 )筛选体验官若干位,然后按照DevStar体验官体验报告(详见附件文档一)的要求操作和体验产品,最后输出体验报告,并按照华为云账号名+微信昵称+体验报告附件的格式回复至本帖。我们会从中筛选出高质量体验报告,给予礼品奖励和积分奖励。体验产品简介:不用开发代码,不需要关注代码仓创建,编译构建、测试、部署等流水线能力建设以及开发所需环境的搭建等等繁琐的开发准备工作,只需要体验通过DevStar服务的“智能OCR图像文字识别”模板一站式生成应用代码并部署到函数工作流FunctionGraph,实现识别指定图片中的文字信息并显示在页面上。产品体验指导链接:https://bbs.huaweicloud.com/blogs/338233?utm_source=dvecloud活动流程:1.如您已经成为产品体验官,小助手会在群内发布招募公告,直接报名即可。2.如您还未申请成为体验官,请点击链接先申请成为体验官,再参与活动哦~申请链接:https://developer.huaweicloud.com/activity/experience-officer.html 中奖率超高哟~~☆奖励设置如下☆参与奖:若干名活动要求:按照要求完成任务奖励:3体验官积分    优秀奖:若干名活动要求:被专家评为优秀报告奖品:定制无线鼠标1个+5体验官积分           本次体验评测报告交稿时间2021.4.15-2022.5.13
  • [版主精选] 华为云GaussDB专家走进课堂,跟莘莘学子聊聊数据库
    近期,各地疫情又一次席卷而来,居家隔离成为常态。不过,外出的不便并没有阻挡莘莘学子求知的渴望,线上课堂成为了大多学生上课的主要形式。在北京邮电大学中,邓芳老师、卢向群老师、杜军平老师、肖晨老师等多名老师所带的计算机学院和国际学院班级中的200多名学生就这样在线开启了本学期数据库课程的学习。 《数据库系统原理》是计算机科学与技术学科知识体系中信息管理领域的核心课程,也是计算机相关专业的核心专业课程。通过此课程的学习,学生可以深入了解数据库系统的基础理论和基本方法、数据库管理系统的核心技术、数据库应用系统设计开发过程、数据库系统操作能力和应用系统设计开发能力,具有对数据库技术领域复杂工程问题采用科学有效的方法进行研究的能力。本学期的《数据库系统原理课程设计》是理论课的后续课程。对学生来说,这更像是一篇毕业论文,因为从确定方向、系统设计、编码、调试、编译、发布,再调试、再学习......每个环节要不断试错、完善,才能完成。这是一场新的探索之旅,将满腹所学皆应用于实践。 校企联合共促数据库产业人才培养所学皆所用,是学习的价值所在。为了让学生们真正将理论应用到实践中,北京邮电大学与华为展开了深入的合作。北京邮电大学是华为与教育部联合建设产学育人“智能基座”项目中的其中一所高校,本着校企联合、产学育人的目的,华为为学校提供教学课件、教学平台等教学资源,并将企业在行业实际应用方面的经验积累、打磨的产品提供给高校,通过双方合作,培养更适用于数据库行业的应用型人才。应北京邮电大学邓芳老师和卢向群老师的邀请,3月16日,华为云数据库技术专家窦德明与北京邮电大学的众多学生相约线上,进行了一次数据库行业知识和技术的分享与交流,目的是让高校的学生们在学习数据库理论的同时,有机会了解数据库行业发展的趋势、动态、新技术探索以及商业环境中的实际应用,为未来有志于从事数据库工作的学生开阔视野,提供实用性的参考和指引。GaussDB走进课堂之数据库行业洞察数据库是“根技术”,一直被誉为基础软件皇冠上的明珠。就像50年代核弹氢弹是高精尖,而在信息时代,信息产业的高精尖主要在基础软硬件的核心控制上,数据库就是其中最重要的软件。从上世纪60年代至今,经历了前关系型数据库、关系型数据库、后关系型数据库三个阶段。二十一世纪一零年代以来,随着互联网与云计算的发展,国产数据库进入快速发展时期,越来越多的厂商在数据库领域进行布局,随之而来的是,数据库相关的各类组织陆续成立,数据库人才培养体系、生态体系也在快速完善。(图片来源:中国信通院发布《数据库发展研究报告(2021年)》)(图片来源:中国信通院发布《数据库发展研究报告(2021年)》)根据中国信通院研究报告数据,2020年全球数据库市场规模为671亿美元,其中中国数据库市场规模为35亿美元(约合241亿元人民币),占全球5.2%。预计到2025年,全球数据库市场规模将达到798亿美元,而中国数据库市场总规模将达到688亿元,市场年复合增长率将达到(CAGR)为23.4%。在数据库发展如火如荼的时代下,上云已经成为数字化时代的一个新标志。从行业角度来说,云是数字化和新基建的关键要素。据预测,到2025年,85%的应用都将运行在云上。软件云化的趋势已经不可逆转,基于云的软件开发也将是未来软件开发的主要形态。云计算也将是各位学子未来的主要职业通道。和IDC或ECS自建数据库相比,使用云数据库可以节省大量的人力和成本,减少繁重和重复的运维工作,客户可以将主要精力聚焦在自己的核心业务上。基于对产业趋势的理解和华为在IT软硬件全栈的长期技术积累,华为云数据库从人才、软硬协同和生态三方面进行战略布局。华为在数据库领域持续研发投入已经有10多个年头,布局全球7大研究所,拥有1000+数据库专业人才;同时,华为积极拥抱开源,并将GaussDB单机主备的核心代码开源,托管到openGauss开源社区,真正做到架构开放、代码开放、技术开放和社区开放;另外,积极推进产、学、研、用相结合,大力投入高校合作,通过校企联合课程培养未来数据库产业人才,与学术界紧密合作,共同开展数据库前沿技术创新及难题公关。GaussDB走进课堂之前沿技术探索在介绍完数据库行业趋势后,窦德明向学生们介绍了华为云数据库——GaussDB的关键特性和核心技术。GaussDB是基于openGauss开源生态打造的企业级分布式数据库,服务于金融政企客户。邓芳老师上学期的数据库课程随堂实验就是基于GaussDB进行,让学生可以专注于学习、实践,学习和了解分布式数据库架构与创新,提前体验商业环境中的数据库形态。在本学期,学生将继续使用GaussDB来进行数据库课程的课程设计。作为新一代金融级分布式数据库,GaussDB是华为全自研产品,应用了多项黑科技核心技术,拥有高性能、高可用、高扩展、高安全、AI-Native自治等诸多核心能力。GaussDB当前已经在1500+金融政企客户规模商用,成功支撑银行核心业务完成系统分布式改造,助力华为消费者云实现智慧化业务运营......越来越多的金融政企客户选择华为云GaussDB作为数字化转型的坚实数据底座。.GaussDB课堂问答两个小时的时间,窦德明为北邮的学生们带来了一场有声有色的数据库知识分享,同时还与学生积极互动,就学生关注的话题做了详细解答,这里我们节选了部分问答:“假定有一个Redis数据库采用AOF作为持久化策略,设定每秒同步一次,如果在同步之前服务器突然宕机,那这一秒的数据改如何恢复呢?”“内存中的数据如果已经写入日志,但日志未写入磁盘的话是恢复不了的。任何数据库都有这个问题,即使跨区域容灾的灾备同步,也无法完全保证这种情况下的数据不丢失。”“对于一些很重要的服务,如何提高数据的可靠性呢?”“这个问题需要从架构上解决,有很多方案。一种是基于存储级的高可靠,在存储与存储之间进行数据备份;一种是数据库级的高可靠,比如华为云分布式数据库支持多副本机制,把数据打散做分片,存储在各个数据节点上,当A节点出现故障后B节点有分片数据,只要存在一个可用数据副本,数据库的状态就是正常的。”“云原生数据库、分布式数据库和大数据技术的区别与联系是什么?”“这是三个不同的维度。云原生数据库主要是和传统数据库进行区分的,传统数据库是客户自己买服务器,自己建机房,硬件资源和数据库只给自己用,就是我们通常所说的“私有云”,云原生数据库是生于云、长于云,从一开始就是基于云的架构体系而孵化出来的数据库,可以理解为面向公有云和混合云场景。分布式数据库是和原来的单机主备数据库进行区分的,比如Oracle、MySQL、DB2这些都是单机主备数据库,数据库实例到达一定数据规模时无法水平扩展,分布式数据库是运用一些新技术,如大集群通信、计算存储分离、数据重分布等实现计算节点、存储节点的弹性扩缩容,解决数据库的扩展性问题。大数据的概念比较泛,通常大家说的大数据是指Hadoop这套体系,比如Spark、Flink等,但远不止这些,数据库、数据仓库、数据湖都是大数据领域的一部分,大数据是相对于传统数据量比较小、数据还没有爆发性增长时而言的,大数据更聚焦于把数据汇集到一起,进行海量数据的分析与挖掘。”“什么叫CN互为主备?如何保证SQL请求只被单个CN节点获取呢?”“CN互为主备就是材料中写的Active-Active,可以理解为断连重连,比如CN 1出现故障, jdbc会自动路由连接CN 2,所有新的SQL请求会通过CN 2下发执行,已经由CN 1下发的SQL将失败回滚。虽然应用连接配置的可能是多个CN,但一条SQL只能通过一个CN下发,只有这个CN故障后,这条SQL重新请求才会走到另外一个CN,以此保证SQL请求只被单个CN获取。”“老师,能不能直接在裸机上开发数据库内核,绕过操作系统呢?”“单纯的数据库内核编译可以绕过操作系统,但调试、部署这些是绕不过的,因为数据库底下就是操作系统,必须跑在操作系统上,还要解决不同操作系统的兼容性问题,所以是没办法绕过去的。”从学生的互动中可以感受到,北京邮电大学数据库课程的学生,不仅仅限于对数据库课堂内容的学习,还对数据库的可靠性、架构以及未来可能的创新点有进一步研究和探索。数据库是讲究生态的产业,生态需要耐心持续的投入。一直以来,华为云GaussDB积极参与和推进产业生态,与高校、开发者、合作伙伴共建生态,并已与国内80+所院校建立起合作关系。未来,华为云GaussDB也将继续携手北京邮电大学以及更多高校,积极推进校企联合,为学生们输送更多行业前沿动态和技术探索,持续完善华为云GaussDB数据库的人才培养体系,保障数据库产业未来人才供给。华为云数据库团队2023届实习岗位已经开放,向想要步入数据库行业的人才张开了怀抱。如果你对数据库充满热爱和好奇,快来和我们一起探索代码奥秘吧!HR专员:zhaochao1@huawei.com
  • [热门活动] 一图解答为什么选择华为云数据库RDS for MySQL!限时18元秒杀、热门规格包年1.5折起~
    开年好物推荐——云数据库RDS for MySQL,简单易用,广泛运用于游戏、电商等行业。18元/1年秒杀,热门规格包年1.5折起,助力用户轻松上云。→https://activity.huaweicloud.com/dbs_Promotion/index.html
  • [优秀博文] 不想业务被中断?快来解锁华为云RDS for MySQL新特性
    相信很多用户在实际业务中都会碰到用户会话被中断这样的痛点,这时候其应用程序需要感知到会话变化,并提供复杂的应对措施来解决故障,比如判断数据库连接是否中断,进行事务补偿以及重建数据库会话上下文等。故障背后的原因其实主要是由主备模式的数据库系统在进行主备倒换、小版本升级和规格变更时造成的,但体现在用户层面上则会对业务造成一定的影响。 华为云RDS for MySQL云数据库新特性重磅发布遇到故障后再采取措施明显不利于业务的连续性,也是企业最不想遇到的情况。华为云RDS for MySQL云数据库最新特性——应用无损透明(ALT)重磅发布,专为解决该痛点而打造,能完好地就业务中断问题对症下药,在进行数据库系统切换与故障转移时,可以提供无损的应用连续性,保证企业业务不中断。该功能主要从三个方面来实现:避免连接和事务中断无需用户对事务进行补偿无需恢复和重建会话上下文 应用无损透明(ALT)的功能实现那么,应用无损透明(ALT)为什么能这么厉害?到底是怎么实现业务连续性的呢?我们不妨从它的技术架构上了解一下。应用无损透明(ALT)功能以用户连接为粒度,用户可以连接到数据库代理(Proxy),在进行主备切换、规格变更或者小版本升级时,系统会复制用户的后台会话,在达到安全的事务边界后,确保后端Session操作上下文被完整克隆至目的节点,从而完成主备切换,保证业务无影响。其中,安全的事务边界是指当前会话上的事务提交完成,开启下一个事务之前的状态,例如:开启autocommit的事务块每个语句执行完成时,单独DML、DDL语句,执行完成,都可以达到事务边界。会话克隆能够拷贝和转移会话状态,包括会话系统变量、用户自定义变量和其他上下文,例如`db_name`,`Prepared Statements`等。应用无损透明(ALT)已通过成功验证目前,该功能已经经过完备的测试。使用了该功能,用户可以通过Sysbench,Tpcc-MySQL或MySQL客户端等各种工具链接到读写分离地址,进行主备切换,从而保障用户的业务不会被突然中断。以下分别是使用Sysbench,Tpcc-MySQL和MySQL客户端工具进行主备切换的效果示意,可以看出,不管哪种工具,都可以保证业务的连续性。使用Sysbench进行主备切换的示例使用Tpcc-MySQL进行主备切换的示例非ALT模式下使用Tpcc-MySQL进行主备切换的示例使用MySQL命令行工具主备切换的示例如下图所示,用户自定义变量、会话变量,数据库在主备切换前后均保持一致。为保证主备切换的可靠性,在开通使用应用无损透明(ALT)的同时,可开通Proxy读写分离,通过读写分离地址连接实例,来保证主备切换的可靠性。业务的高安全和高可靠是每个企业的硬性需求。在应用无损透明(ALT)的加持下,华为云RDS for MySQL云数据库将以更优越的容灾能力满足企业多种可用性需求,实时为企业业务保驾护航!【重磅推荐】开年采购享好价!华为云数据库MySQL、GaussDB(for Redis)18元/年限量秒杀,不限新老用户包年3折起。活动期间还有8000元大礼包、满额赠华为笔记本、0门槛抽奖等多重福利!https://activity.huaweicloud.com/dbs_Promotion/index.html
  • [热门活动] 活动倒计时7天!MySQL18元秒杀不容错过~热门规格包年1.5折起!
    开年采购季倒计时7天!MySQL18元秒杀不容错过,热门规格包年1.5折起,搭配ECS、企业级Redis一起下单,优惠更多。活动期间还有8000元大礼包、满额赠华为笔记本、0门槛抽奖等多重福利!点击查看活动详情→https://activity.huaweicloud.com/dbs_Promotion/index.html
  • [技术干货] 如何从头到脚彻底解决一个MySQL Bug?华为云数据库高级专家带你看【转载】
    说明:本文中的MySQL,如果不做特殊说明,指的是开源社区版MySQL。华为云数据库新版本在发布之前,会面临一系列严苛的测试规则,除了要求通过MySQL的所有测试用例之外,还需要通过由华为百万级更丰富、更贴近用户业务场景的测试用例构筑的测试防护网,以此充分验证新版本是否满足用户经典场景的稳定性。  正是在这样严苛的验证过程中,我们发现了MySQL的一个潜在Bug。   Bug描述测试环境: 基于相同的测试用例、数据集,分别测试MySQL 8.0.22, MySQL 8.0.26,与华为云GaussDB(for MySQL)的返回结果。  测试语句: select subq_0.c2 as c0 from (select ref_6.C_STATE asc0, case whenref_6.C_PHONE is not NULL then ref_5.C_ID else ref_5.C_ID end asc1, floor( ref_3.c_id)as c2 from sqltester.t0_hash_partition_p1_view as ref_0 right join sqltester.t4 as ref_1 on (EXISTS ( select ref_1.c_middle as c0 from sqltester.t1 as ref_2 where ((false) and ((true) or (true))) or (false) )) innerjoin sqltester.t0_range_key_subpartition_sub_view as ref_3 on(EXISTS ( select ref_0.c_credit as c0, ref_1.c_street_1 as c1, ref_4.c_credit_lim as c2, ref_3.c_credit as c3 from sqltester.t0_hash_partition_p1 as ref_4 where true )) left joinsqltester.t10 as ref_5 innerjoin sqltester.t11 as ref_6 on(true) on (((pi() isnot NULL)) and (false)) where (((ref_5.C_D_ID isnot NULL) or(ref_3.c_middle is not NULL)) )) as subq_0 where (EXISTS ( select subq_0.c0 as c0, pi() as c1, ref_11.c_street_1 as c2, ref_11.c_discount as c3, pi() as c4 from sqltester.t0_partition_sub_view_mixed_001 as ref_11)) group by 1 order by 1;返回结果: 如下图所示,MySQL 8.0.22、MySQL8.0.26与华为云GaussDB(for MySQL)的返回结果不一致,也就是说产生了Bug,如下图红色部分。 Bug分析首先确定哪一个执行结果是正确的。当前这个语句执行的execution plan是Hash Join,而MySQL8.0里面引入了Hash Join,由此推论开源版本可能存在问题。接下来我们从MySQL成熟版本以及非MySQL数据库两个方面来进行验证。   验证过程:使用相对成熟的版本MySQL 5.6进行验证,返回结果与GaussDB(for MySQL)相同,但与MySQL 8.0不同。使用PostgreSQL进行验证,执行结果与MySQL 5.6、GaussDB(for MySQL)相同,但与MySQL 8.0及更高版本不同。  由此可以确定:MySQL 8.0以及更高版本存在问题。   那么,是什么原因引起了这一Bug呢? 1.  首先精简查询,以方便后面分析。经过多次验证,将查询简化如下: SELECT count(*) FROM (SELECT 1 FROM sqltester.t4 AS ref_1 INNER JOIN sqltester.t4 AS ref_3 ON (EXISTS (SELECT 1 FROMsqltester.t4 AS ref_4 WHERE TRUE )) LEFT JOIN sqltester.t10 AS ref_5 ON (FALSE) WHERE (((ref_5.C_D_ID IS NOT NULL) OR (ref_3.c_middle IS NOT NULL))))AS subq_0 执行计划如下: -> Aggregate: count(0) (cost=2.75 rows=0) -> Filter: ((ref_5.C_D_ID is not null) or(ref_3.c_middle is null)) (cost=2.75 rows=0) -> Inner hash join(no condition) (cost=2.75 rows=0) -> Index scan on ref_3 using ndx_c_middle (cost=0.13 rows=50) -> Hash -> Inner hash join (no condition) (cost=1.50 rows=0) -> Index scan on ref_1 using ndx_c_id (cost=6.25 rows=50) -> Hash -> Left hash join (no condition) (cost=0.25 rows=0) -> Limit: 1 row(s) (cost=312.50 rows=1) ->Index scan on ref_4 using ndx_c_id (cost=312.50 rows=50) -> Hash -> Zero rows (Impossible filter) (cost=0.00..0.00 rows=0)从上面的执行计划可以看出,ref_5被优化器进行了优化,转换成了Zero rows,而且ref_5是Left Hash Join的内表。作为Left Join的内表,如果内表没有匹配条件的记录(这里已经是Impossible条件了,也就是说连接条件始终是False),则需要内表生成NULL行来和外表进行外表连接。   2.  在MySQL 8.0.22版本上执行问题查询,语句和执行结果如下: SELECT count(*) FROM (SELECT 1 FROM sqltester.t4 AS ref_1 INNER JOIN sqltester.t4 AS ref_3 ON (EXISTS (SELECT 1 FROM sqltester.t4 AS ref_4 WHERE TRUE )) LEFT JOIN sqltester.t10 AS ref_5 ON (FALSE) WHERE (((ref_5.C_D_ID IS NOT NULL) or(ref_3.c_middle IS NOT NULL))))AS subq_0; + + | count(*) | + + | 2500 | + + 1 row in set (0.00 sec)3.  对问题查询进行修改:去掉Where条件里面的另外一个条件(ref_3.c_middleis NULL)。 现在Where条件只包含了(ref_5.C_D_IDIS NOT NULL)一个条件,要求当前查询过滤掉所有ref_5没有匹配的连接记录。   则SQL语句和执行结果如下: SELECT count(*) FROM (SELECT 1 FROM sqltester.t4 AS ref_1 INNER JOIN sqltester.t4 AS ref_3 ON (EXISTS (SELECT 1 FROM sqltester.t4 AS ref_4 WHERE TRUE )) LEFT JOIN sqltester.t10 AS ref_5 ON (FALSE) WHERE (((ref_5.C_D_ID IS NOT NULL))))assubq_0; + + | count(*) | + + | 2500 | + + 1 row in set (0.01 sec)对比修改前后的语句和执行结果可以看出:执行结果与条件(ref_3.c_middle is NULL)没有关系,只与(ref_5.C_D_ID IS NOT NULL)这个条件有关。正常情况下对ref_5表来说,因为是Impossible条件,所以ref_5被优化成了Zero rows。那么如果只剩(ref_5.C_D_ID IS NOT NULL)这个条件,正常的结果应该是空集(count返回0)。但现在开源版本的结果集却不是,这再次说明了开源版本出现了问题。   对于Left Join来说,如果Join条件不匹配,内表需要设置为NULL行来连接外表。而这里执行计划使用的是Zero rows,也就是说MySQL 8.0使用的是ZeroRowsIterator来执行的。执行器需要调用ZeroRowsIterator::SetNullRowFlag来设置Nullflag。   4.  通过gdb来查看设置是否正确: Breakpoint 1, ZeroRowsIterator::SetNullRowFlag(this=0x7f92a413d510, is_null_row=false) at /mywork/mysql-sql/sql/basic_row_iterators.h:398 398 assert(m_child_iterator != nullptr); (gdb) n 399 m_child_iterator->SetNullRowFlag(is_null_row); (gdb) s std::unique_ptr<RowIterator,Destroy_only<RowIterator> >::operator-> (this=0x7f92a413d520) at/opt/simon/taurus/mysql-root/src/tools/gcc-9.3.0/include/c++/9.3.0/bits/unique_ptr.h:355 355 returnget(); (gdb) fin Run till exit from #0 std::unique_ptr<RowIterator,Destroy_only<RowIterator> >::operator-> ( this=0x7f92a413d520) at/opt/simon/taurus/mysql-root/src/tools/gcc-9.3.0/include/c++/9.3.0/bits/unique_ptr.h:355 ZeroRowsIterator::SetNullRowFlag (this=0x7f92a413d510,is_null_row=false) at/home/simon/mywork/mysql-sql/sql/basic_row_iterators.h:399 399 m_child_iterator->SetNullRowFlag(is_null_row); Value returned is $1 = (RowIterator *) 0x7f92a413d4d0 (gdb) s TableRowIterator::SetNullRowFlag (this=0x7f92a413d4d0,is_null_row=false) at/home/simon/mywork/mysql-sql/sql/records.cc:229 229 if(is_null_row) { (gdb) n 232 m_table->reset_null_row(); (gdb) 234 }从上面的gdb来看,断点处利用ZeroRowsIterator::SetNullRowFlag将表的Nullflag设置为了False。后面的gdb信息也证明了这一点。   可以确定,导致此Bug的原因是:ZeroRowsIterator::SetNullRowFlag设置为False这里是不正确的。因为如果把ZeroRowsIterator::SetNullRowFlag设置为False,那就会导致内表为ZeroRows的Left Join生成内表非NULL的结果集。 如何解决既然上面的Bug分析已经非常清楚了,那么修复起来也就比较简单了。只需要将ZeroRowsIterator::SetNullRowFlag始终设置为True就可以了。因为ZeroRowIterator只能产生两种结果,一种是空集,另一种就是作为外连接的内表产生NULL行。 对MySQL-8.0.26进行修复后,执行结果如下: 从返回的结果可以看出查询结果正确,也就是说问题得到了修复。   为了保障华为云GaussDB产品的可靠性,每一款产品发布前都要通过多轮严苛的测试用例。在发现问题后,华为云数据库团队以缜密的思路去逐步确定问题、分析问题,并第一时间修复Bug,解决问题,以确保客户的数据安全和业务结果的准确性。华为云数据库团队荟聚了业内50%以上的数据库内核专家,以专业技术实时保障客户业务安全,助力企业业务安全上云!
  • [热门活动] 《数据库原理》MOOC第3季 春日携礼归来,MOOC免费学, 分享得更多!
    《数据库原理▪GaussDB云数据库》MOOC第3季 春日携礼归来【活动时间】2022年3月15日 - 7月15日【活动主题】《数据库原理▪GaussDB云数据库》MOOC—第3季 春日携礼归来,MOOC免费学, 分享得更多【活动内容】 活动一: MOOC免费学Step1:点击报名:《数据库原理•GaussDB云数据库》MOOCStep2:报名完成后,将MOOC报名学习页面截图,盖楼打卡即可Tips:每个ID抢楼不得连续超过3楼,总楼层数不得超过10楼盖楼内容:华为云账号+MOOC报名学习截图;活动二:分享得更多转发下方活动海报至朋友圈,+转发语:《数据库原理▪GaussDB云数据库》MOOC—第3季 春日携礼归来:课程由8位博导团队+华为云数据库技术专家共同打造,免费学习还有好礼哦,可别错过啦!公开可见保持2小时以上,将转发内容的朋友圈截图回复至下方评论区!Tips:一定要公开可见保持2小时哦~【中奖规则】踩中幸运中奖楼层【奖励】活动1【奖励】活动2【盖楼超50层】楼层5%、15%、25%、35%、45%、55%、65%、75%、85%、95%500码豆/人1000码豆/人楼层8%、38%、68%、88%雨伞/高硼玻璃杯/GaussDB字母笔价值69元的书籍《数据库原理及应用》 其他活动开年采购季,8000元见面礼+0门槛抽奖,云数据库包年18元起!【参与有奖】GaussDB(for MySQL) 关键特性发布和技术解读什么是码豆?会员中心入口:https://devcloud.huaweicloud.com/bonususer/home码豆奖励活动规则:1)码豆可在码豆会员中心兑换实物礼品。2)码豆只能用于会员中心的礼品兑换,不得转让,具体规则请到会员中心阅读“码豆规则”。3)为保证码豆成功发放,如果修改过账号名还请向工作人员提供修改前后的账号名。  活动规则 1)请务必使用个人账号参与活动(IAM、企业账号等账号参与无效)。2)所有获得华为奖项的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。3)本次活动如一个实名认证对应多个账号,只有一个账号可领取奖励;一个实名认证账号只能对应一个收件人,如同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。4)活动结束且用户填写完成领奖信息后,15个工作日内发放奖品,发放时间根据实际情况动态调整,如有延期敬请见谅。5)本活动最终解释权归华为云所有。
  • [优秀博文] 如何从头到脚彻底解决一个MySQL Bug?华为云数据库高级专家带你看
    说明:本文中的MySQL,如果不做特殊说明,指的是开源社区版MySQL。 华为云数据库新版本在发布之前,会面临一系列严苛的测试规则,除了要求通过MySQL的所有测试用例之外,还需要通过由华为百万级更丰富、更贴近用户业务场景的测试用例构筑的测试防护网,以此充分验证新版本是否满足用户经典场景的稳定性。   正是在这样严苛的验证过程中,我们发现了MySQL的一个潜在Bug。   Bug描述测试环境: 基于相同的测试用例、数据集,分别测试MySQL 8.0.22, MySQL 8.0.26,与华为云GaussDB(for MySQL)的返回结果。  测试语句: select subq_0.c2 as c0 from (select ref_6.C_STATE asc0, case whenref_6.C_PHONE is not NULL then ref_5.C_ID else ref_5.C_ID end asc1, floor( ref_3.c_id)as c2 from sqltester.t0_hash_partition_p1_view as ref_0 right join sqltester.t4 as ref_1 on (EXISTS ( select ref_1.c_middle as c0 from sqltester.t1 as ref_2 where ((false) and ((true) or (true))) or (false) )) innerjoin sqltester.t0_range_key_subpartition_sub_view as ref_3 on(EXISTS ( select ref_0.c_credit as c0, ref_1.c_street_1 as c1, ref_4.c_credit_lim as c2, ref_3.c_credit as c3 from sqltester.t0_hash_partition_p1 as ref_4 where true )) left joinsqltester.t10 as ref_5 innerjoin sqltester.t11 as ref_6 on(true) on (((pi() isnot NULL)) and (false)) where (((ref_5.C_D_ID isnot NULL) or(ref_3.c_middle is not NULL)) )) as subq_0 where (EXISTS ( select subq_0.c0 as c0, pi() as c1, ref_11.c_street_1 as c2, ref_11.c_discount as c3, pi() as c4 from sqltester.t0_partition_sub_view_mixed_001 as ref_11)) group by 1 order by 1;返回结果: 如下图所示,MySQL 8.0.22、MySQL8.0.26与华为云GaussDB(for MySQL)的返回结果不一致,也就是说产生了Bug,如下图红色部分。 Bug分析首先确定哪一个执行结果是正确的。当前这个语句执行的execution plan是Hash Join,而MySQL8.0里面引入了Hash Join,由此推论开源版本可能存在问题。接下来我们从MySQL成熟版本以及非MySQL数据库两个方面来进行验证。   验证过程:使用相对成熟的版本MySQL 5.6进行验证,返回结果与GaussDB(for MySQL)相同,但与MySQL 8.0不同。使用PostgreSQL进行验证,执行结果与MySQL 5.6、GaussDB(for MySQL)相同,但与MySQL 8.0及更高版本不同。  由此可以确定:MySQL 8.0以及更高版本存在问题。   那么,是什么原因引起了这一Bug呢? 1.  首先精简查询,以方便后面分析。经过多次验证,将查询简化如下: SELECT count(*) FROM (SELECT 1 FROM sqltester.t4 AS ref_1 INNER JOIN sqltester.t4 AS ref_3 ON (EXISTS (SELECT 1 FROMsqltester.t4 AS ref_4 WHERE TRUE )) LEFT JOIN sqltester.t10 AS ref_5 ON (FALSE) WHERE (((ref_5.C_D_ID IS NOT NULL) OR (ref_3.c_middle IS NOT NULL))))AS subq_0 执行计划如下: -> Aggregate: count(0) (cost=2.75 rows=0) -> Filter: ((ref_5.C_D_ID is not null) or(ref_3.c_middle is null)) (cost=2.75 rows=0) -> Inner hash join(no condition) (cost=2.75 rows=0) -> Index scan on ref_3 using ndx_c_middle (cost=0.13 rows=50) -> Hash -> Inner hash join (no condition) (cost=1.50 rows=0) -> Index scan on ref_1 using ndx_c_id (cost=6.25 rows=50) -> Hash -> Left hash join (no condition) (cost=0.25 rows=0) -> Limit: 1 row(s) (cost=312.50 rows=1) ->Index scan on ref_4 using ndx_c_id (cost=312.50 rows=50) -> Hash -> Zero rows (Impossible filter) (cost=0.00..0.00 rows=0)从上面的执行计划可以看出,ref_5被优化器进行了优化,转换成了Zero rows,而且ref_5是Left Hash Join的内表。作为Left Join的内表,如果内表没有匹配条件的记录(这里已经是Impossible条件了,也就是说连接条件始终是False),则需要内表生成NULL行来和外表进行外表连接。   2.  在MySQL 8.0.22版本上执行问题查询,语句和执行结果如下: SELECT count(*) FROM (SELECT 1 FROM sqltester.t4 AS ref_1 INNER JOIN sqltester.t4 AS ref_3 ON (EXISTS (SELECT 1 FROM sqltester.t4 AS ref_4 WHERE TRUE )) LEFT JOIN sqltester.t10 AS ref_5 ON (FALSE) WHERE (((ref_5.C_D_ID IS NOT NULL) or(ref_3.c_middle IS NOT NULL))))AS subq_0; + + | count(*) | + + | 2500 | + + 1 row in set (0.00 sec)3.  对问题查询进行修改:去掉Where条件里面的另外一个条件(ref_3.c_middleis NULL)。 现在Where条件只包含了(ref_5.C_D_IDIS NOT NULL)一个条件,要求当前查询过滤掉所有ref_5没有匹配的连接记录。   则SQL语句和执行结果如下: SELECT count(*) FROM (SELECT 1 FROM sqltester.t4 AS ref_1 INNER JOIN sqltester.t4 AS ref_3 ON (EXISTS (SELECT 1 FROM sqltester.t4 AS ref_4 WHERE TRUE )) LEFT JOIN sqltester.t10 AS ref_5 ON (FALSE) WHERE (((ref_5.C_D_ID IS NOT NULL))))assubq_0; + + | count(*) | + + | 2500 | + + 1 row in set (0.01 sec)对比修改前后的语句和执行结果可以看出:执行结果与条件(ref_3.c_middle is NULL)没有关系,只与(ref_5.C_D_ID IS NOT NULL)这个条件有关。正常情况下对ref_5表来说,因为是Impossible条件,所以ref_5被优化成了Zero rows。那么如果只剩(ref_5.C_D_ID IS NOT NULL)这个条件,正常的结果应该是空集(count返回0)。但现在开源版本的结果集却不是,这再次说明了开源版本出现了问题。   对于Left Join来说,如果Join条件不匹配,内表需要设置为NULL行来连接外表。而这里执行计划使用的是Zero rows,也就是说MySQL 8.0使用的是ZeroRowsIterator来执行的。执行器需要调用ZeroRowsIterator::SetNullRowFlag来设置Nullflag。   4.  通过gdb来查看设置是否正确: Breakpoint 1, ZeroRowsIterator::SetNullRowFlag(this=0x7f92a413d510, is_null_row=false) at /mywork/mysql-sql/sql/basic_row_iterators.h:398 398 assert(m_child_iterator != nullptr); (gdb) n 399 m_child_iterator->SetNullRowFlag(is_null_row); (gdb) s std::unique_ptr<RowIterator,Destroy_only<RowIterator> >::operator-> (this=0x7f92a413d520) at/opt/simon/taurus/mysql-root/src/tools/gcc-9.3.0/include/c++/9.3.0/bits/unique_ptr.h:355 355 returnget(); (gdb) fin Run till exit from #0 std::unique_ptr<RowIterator,Destroy_only<RowIterator> >::operator-> ( this=0x7f92a413d520) at/opt/simon/taurus/mysql-root/src/tools/gcc-9.3.0/include/c++/9.3.0/bits/unique_ptr.h:355 ZeroRowsIterator::SetNullRowFlag (this=0x7f92a413d510,is_null_row=false) at/home/simon/mywork/mysql-sql/sql/basic_row_iterators.h:399 399 m_child_iterator->SetNullRowFlag(is_null_row); Value returned is $1 = (RowIterator *) 0x7f92a413d4d0 (gdb) s TableRowIterator::SetNullRowFlag (this=0x7f92a413d4d0,is_null_row=false) at/home/simon/mywork/mysql-sql/sql/records.cc:229 229 if(is_null_row) { (gdb) n 232 m_table->reset_null_row(); (gdb) 234 }从上面的gdb来看,断点处利用ZeroRowsIterator::SetNullRowFlag将表的Nullflag设置为了False。后面的gdb信息也证明了这一点。   可以确定,导致此Bug的原因是:ZeroRowsIterator::SetNullRowFlag设置为False这里是不正确的。因为如果把ZeroRowsIterator::SetNullRowFlag设置为False,那就会导致内表为ZeroRows的Left Join生成内表非NULL的结果集。 如何解决既然上面的Bug分析已经非常清楚了,那么修复起来也就比较简单了。只需要将ZeroRowsIterator::SetNullRowFlag始终设置为True就可以了。因为ZeroRowIterator只能产生两种结果,一种是空集,另一种就是作为外连接的内表产生NULL行。 对MySQL-8.0.26进行修复后,执行结果如下: 从返回的结果可以看出查询结果正确,也就是说问题得到了修复。   为了保障华为云GaussDB产品的可靠性,每一款产品发布前都要通过多轮严苛的测试用例。在发现问题后,华为云数据库团队以缜密的思路去逐步确定问题、分析问题,并第一时间修复Bug,解决问题,以确保客户的数据安全和业务结果的准确性。华为云数据库团队荟聚了业内50%以上的数据库内核专家,以专业技术实时保障客户业务安全,助力企业业务安全上云!
  • [版主精选] 亿级月活沙盒平台《迷你世界》背后的黑科技
    年少时期,我们有过许多梦,想仗剑天涯,想修种藩篱,想成为建筑大师,想改变世界……无论梦想最终是否如愿,那段独属我们的青春欢乐时光将永远熠熠生辉。今天,有一款面向青少年的游戏创造了很多虚拟世界,来看看有你年少时的梦吗?迷你创想(深圳)科技有限公司(简称:迷你创想)是一家致力于打造优秀的青少年创意实践平台的企业,其倾力打造的《迷你世界》是一款国产沙盒创意平台,主要通过方块组合自由创造等方式,引导用户在平台上创作虚拟作品。用户、开发者和虚拟场景共同构建了活跃的内容生态,而不断完善的低门槛多样化的强大工具,让《迷你世界》里的“虚拟积木”摆脱了现实的种种限制,用户能够实现各种**行空的场景化搭建。稳定性与弹性两手抓,支持大规模全真虚拟互动《迷你世界》自2015年上线至今,单月月活跃用户已突破1亿,影响力巨大。其旗下虚拟偶像“花小楼”发行的单曲,总播放量超过2亿次。迷你云服是支撑《迷你世界》的服务平台,提供更为稳定的联机服务,以增强用户联机的游戏体验。随着用户剧增和访问量的加大,迷你云服在稳定性和弹性扩容方面面临挑战:稳定性:游戏业务对数据库的稳定性要求极高,系统不稳定将直接导致用户流失。弹性扩容:用户数据过百亿,业务高峰期资源要快速下发升配,以保障玩家体验。面对挑战,一场平台升级之旅就此开启。华为云数据库团队围绕客户需求,针对业务特点因地制宜打造了一套合理高效的游戏数据库方案,从部署架构到分布式设计,基于RDS和分布式数据库中间件DDM提供了高性能、稳定可靠、弹性扩容等能力,提升用户联机的游戏体验,为迷你创想1亿+用户畅玩游戏保驾护航。主备架构优化:使用RDS云盘主备实例,该实例经过海量用户生产系统充分验证,在数据库性能和稳定性方面极具优势,可轻松应对海量访问压力。分库分表改造:采用DDM+RDS做分库分表改造,使用hash算法针对用户的唯一键进行业务拆分,由原先的集中式修改为分布式,均衡负载以提升数据库性能。节点快速扩容:针对客户业务场景,提供DDM计算节点快速扩容、RDS节点快速规格变更等能力,解决客户高峰期资源快速下发问题。华为云数据库全力负责《迷你世界》的底层资源保障,实现了2个月内完成游戏内测至上线全流程,提升了业务上线效率;在游戏运行期间,支撑了海量游戏用户同时在线,为花小楼音乐会等高峰场景的稳定运行提供了坚实的保障。创作开发工具便捷化,驱动创新内容生产作为国内TOP1的沙盒创意类游戏,迷你世界拥有的繁荣UGC生态,迷你世界上有7000万开发者每天在不断地创作新内容。相应的,游戏也需要不断给开发者提供各种工具,让开发者们发挥想象,进行场景、人物的创作。 在内容创作方面,迷你世界推出了自定义模型编辑器用来构建3D角色的动作能力,模型编辑器里搭载了华为终端云的AR ENGINE。基于这个编辑器,玩家可以在游戏中对他人的特定动作进行拍摄,将复杂的三维**动作转化成骨骼动态,上传到游戏中映射到游戏角色。游戏角色可以随玩家做出奔跑,跳跃,转身,挥手的动作,虚实结合的同时大大增加了游戏趣味性。那在这其中,AR Engine简化了自定义动作创作,仅用一台华为手机即可完成所有内容创作,创作时间从天级缩短到分钟级,内容创作难度大大降低,引发了虚实角色创作的热潮。海量内容审核智能化,构建健康游戏环境开发者们每天创造了大量的内容,这些内容高效审核是一个很让人头疼的问题。为了确保内容场景的合规性,《迷你世界》每天需要进行大量且细致的内容审核,对审核准确率和实时性要求极高。为此,迷你创想构建了一套严格的内容审核流程,用户上传内容先经本地词库过滤,后续通过华为云AI智能审核与人工复查,极大提高不良内容审核效率和准确率,为平台用户提供健康、清洁的游戏环境。 技术升级促进游戏内容和玩法创新,相信未来,迷你创想将和华为云一起为游戏玩家提供更流畅、有趣的游戏体验,让我们拭目以待!【重磅活动推荐】开年采购享好价!华为云数据库MySQL、GaussDB(for Redis)18元/年限量秒杀,不限新老用户包年3折起。活动期间还有8000元大礼包、满额赠华为笔记本、0门槛抽奖等多重福利!https://activity.huaweicloud.com/dbs_Promotion/index.html
  • [技术干货] 使用Cloud DB构建APP 快速入门-快应用篇
    快应用的数据将会储存在云侧,本地不会缓存数据。在进行数据管理操作时,您将会直接操作云侧数据。快应用 SDK将会为您的应用与云数据库的通讯和通讯安全提供保障。使用Cloud DB构建快应用,需要完成以下准备工作:您已经在开发者联盟官网注册帐号并通过实名认证,详细请参见帐号注册认证。完成开发环境的搭建,包括在PC上安装快应用IDE、在测试手机安装快应用加载器,详细参见安装开发工具。在AppGallery Connect控制台上完成快应用的创建,详细参见创建快应用。使用快应用IDE生成证书指纹,并在AppGallery Connect控制台上完成指纹的配置,详细参见生成、配置指纹证书。您已经获取到示例代码,请从示例代码获取。启用服务使用Cloud DB服务前,您需要先启用服务。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要启用云数据库服务的应用。在导航树上选择“构建 > 云数据库”。单击“立即开通”,开通云数据库服务。            (可选)如您还未选择数据处理位置,需要您先设置数据处理位置,具体操作请参见设置数据处理位置。服务初始化成功后,即启用云数据库服务成功。新增和导出对象类型您需要基于AppGallery Connect控制台创建对象类型,请您遵循操作步骤创建示例中涉及的对象类型,并导出用于快应用开发的json格式和js格式对象类型文件。不允许修改导出的json格式和js格式文件,否则会导致数据同步功能异常。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要创建对象类型的应用。在导航树上选择“构建 > 云数据库”。单击“新增”,进入创建对象类型页面。            输入对象类型名为“BookInfo”后,单击“下一步”。单击,新增如下字段后,单击“下一步”。表1 字段定义表字段名称类型主键非空加密默认值idInteger√√––bookNameString––––authorString––––priceDouble––––publisherString––––publishTimeDate––––shadowFlagBoolean–––true单击,设置索引名为“bookName”,索引字段为“bookName”后,单击“下一步”。按照如下要求设置各角色权限后,单击“下一步”。单击“确定”。创建完成后返回对象类型列表中,可以查看已创建的对象类型。单击“导出”。                                                    导出“json格式”和“js格式”文件,导出的文件在后续步骤用于添加至本地开发环境。导出json格式文件选择“json格式”。单击“导出”。导出js格式文件选择“js格式”。选择js文件类型,选择“js”。单击“导出”。新增存储区您可基于AppGallery Connect控制台在云侧创建数据存储区,请您遵循操作步骤创建一个存储区名称为“QuickStartDemo”的存储区。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要创建存储区的应用。在导航树上选择“构建 > 云数据库”。选择“存储区”页签。单击“新增”,进入创建存储区页面。                         输入存储区名称为“QuickStartDemo”。单击“确定”。创建完成后返回存储区列表中,可以查看已创建的存储区。配置开发环境创建一个快应用项目。打开快应用IDE,在欢迎页单击登录,在跳转的网页中登录注册的帐号。登录成功后,IDE的导航选择“新建工程 > 快应用-云开发”,选择关联应用、模板,设置项目路径后,单击“确定”。关联应用:选择之前在AppGallery Connect上创建的快应用。项目路径:存放Serverless项目工程的路径。                                                                                          新建项目结构主要由quickapp.config.json、client、cloudfunctions组成。|-- client 用于存放标准快应用代码|-- |-- src 标准快应用源码目录|-- |-- |-- Common 快应用公共资源文件目录|-- |-- |-- Hello 快应用主文件目录|-- |-- |-- app.ux 快应用入口文件|-- |-- |-- manifest.json 快应用配置文件|-- |-- package.json 快应用代码依赖云函数SDK的配置文件|-- cloudfunctions 云函数目录,该目录下可以创建多个云函数目录|-- quickapp.config.json serverless项目的配置文件                                                             quickapp.config.json针对serverless项目的配置信息如下:quickappRoot:表示client端快应用代码目录,快应用serverless项目只会编译打包该目录下的内容。                                                          cloudfunctionRoot:表示serverless项目云函数目录,该目录主要存放项目所有云函数代码。配置应用信息。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下的应用。选择“常规”页签,下载配置文件“agconnect-services.json”,并拷贝到您的快应用项目src目录下。在hello.ux文件中添加agconnect-services.json文件引用。const context = require('../agconnect-services.json');集成Cloud DB SDK。执行如下命令,安装Cloud DB JavaScript SDK云数据库服务模块到您的项目中。npm install --save @agconnect/database在您的项目中导入database组件。import "@agconnect/database";在manifest.json文件的 features属性中增加如下配置。{"name": "system.cipher"}添加对象类型文件在开发应用时,可直接将AppGallery Connect控制台上导出的json格式和js格式文件添加至本地开发环境,并通过AGConnectCloudDB类中的createObjectType()方法实现对象类型的定义和创建。您在进行本地应用开发时,无需再次创建对象类型。将已在AppGallery Connect控制台上导出的全部json格式和js格式文件添加至本地开发环境。初始化Cloud DB,通过AGConnectCloudDB类中的createObjectType()方法实现对象类型的定义和创建,详细请参见初始化。初始化在添加对象类型文件后,您就可以使用云数据库进行应用开发。您开发应用时,需要先执行初始化操作,初始化AGConnectCloudDB、创建Cloud DB zone和对象类型。通过initialize()初始化AGConnectCloudDB。AGConnectCloudDB.initialize(context);通过getInstance()方法获取AGConnectCloudDB实例,并使用createObjectType()创建对象类型。const schema = require('./BookInfo.json'); agcCloudDB = AGConnectCloudDB.getInstance(); agcCloudDB.createObjectType(schema);打开Cloud DB zone。const config = new CloudDBZoneConfig('QuickStartDemo'); cloudDBZone = await agcCloudDB.openCloudDBZone(config);写入数据在本节主要介绍如何在应用程序中进行数据写入操作,如下所示,使用executeUpsert()实现数据的写入。async function executeUpsert (book) { try { const cloudDBZoneResult = await cloudDBZone.executeUpsert(book); console.log('upsert' + cloudDBZoneResult + 'record' ); } catch (e) { console.log('upsert failed with reason'); conso.log(e); } }查看数据获取数据变化用户在应用界面中新增的数据,将会被存储在云侧。在端侧注册数据变化侦听器,当云侧数据发生变化时,端侧能够感知数据变化。通过查询条件与subscribeSnapshot()方法组合使用,可以指定侦听对象,当侦听对象的数据发生变化时,端侧会收到数据变化通知,并生成新的快照,触发用户回调。async function subscribeSnapshot () { const query = CloudDBZoneQuery.where(BookInfo); query.equalTo('shadowFlag', true); try { const onSnapshotListener = { onSnapshot: (snapshot, e) => { if (e !== null && e !== undefined && e.code !== AGConnectCloudDBExceptionCode.Ok) { console.log('subscribeSnapshot error'); console.log(e); } return snapshot.getSnapshotObjects(); } }; const listenerHandler = await cloudDBZone.subscribeSnapshot(query, onSnapshotListener); console.log(listenerHandler); } catch (e) { console.log('subscribeSnapshot error'); console.log(e); return null; } } function subscribeBookList() { subscribeSnapshot().then(snapshot => { snapshot.getDeletedObjects(); const resultList = snapshot.getSnapshotObjects(); console.log(resultList); }) }数据查询和排序通过executeQuery()实现异步方式查询数据。async function executeQuery() { try { const query = CloudDBZoneQuery.where(BookInfo); const snapshot = await cloudDBZone.executeQuery(query); const resultArray = snapshot.getSnapshotObjects(); console.log(resultArray); } catch(e) { console.log(e); } }通过查询与limit()方法组合,实现限制查询数据显示条数的功能;与orderByAsc()方法或者orderByDesc()方法组合来实现数据的排序功能。async function executeQueryWithOrder (object) { const query = CloudDBZoneQuery.where(BookInfo); if (object.name.length > 0) { query.equalTo('bookName', object.name); } if (parseFloat(object.minPrice) > 0) { query.greaterThanOrEqualTo('price', parseFloat(object.minPrice)); } if (parseFloat(object.maxPrice) > 0 && parseFloat(object.maxPrice) > parseFloat(object.minPrice)) { query.lessThanOrEqualTo('price', parseFloat(object.maxPrice)); } if (parseInt(object.bookCount) > 0) { query.limit(parseInt(object.bookCount)); } query.orderByAsc('id'); try { const snapshot = await cloudDBZone.executeQuery(query); console.log('resultArray'); console.log(snapshot.getSnapshotObjects()); return snapshot.getSnapshotObjects(); } catch (e) { console.log('query failed with reason'); console.log(e); } }
  • [行业资讯] 华为云携手甘肃省医疗保障局,以数字科技为智慧医疗注入新动能
    自古以来,甘肃便是我国中医药文化的重要发源地,孕育了医药鼻祖伏羲、中华医祖岐伯,也孕育了这片土地上世世代代的子孙。几千年后,经过历史长河的沉淀,甘肃仍然在向中医药强省稳步迈进。医疗是民生之需。2019年,国家医疗保障局颁布《关于医疗保障信息化工作的指导意见》,要建立全国统一的医保信息系统,搭建国家和省两级医保信息平台,提高全国医保的标准化、智能化,信息化。作为拥有深厚医药文化底蕴的甘肃自然一马当先,加速搭乘“数字化”列车,大力推进中医药强省建设,为百姓就医谋便利。医保升级好事多磨不过,一个参保人数超2642万的大省,说起医保升级,并没有想象中那么容易。按照国家医保局的建设要求,应对旧医保平台进行优化和升级,而老医保平台还在使用传统数据库,扩展性较弱。同时,新平台要求业务请求端到端时延应该缩短至秒级,而老医保平台结算类业务延迟高、响应慢,办事效率尤待加强。从业务端来看,省级医保平台业务面向全省参保人口,并发量高、数据量大,业务数据量能达到百TB级别,因此数据库还需要同时满足性能和存储容量的双重高要求。同样重要的是,医保业务属于类金融类的民生业务,其系统的稳定性、可靠性不可忽视,需要具备故障自动切换的高可用能力和数据完整灾备能力。华为云数据库对症下药2020年9月,华为云凭借自身在云计算、大数据、计算、存储等方面的产品优势,全份额中标甘肃省医疗保障信息平台建设项目,为该平台提供了强可靠的支撑和保障。华为云分布式数据库DDM+RDS for MySQL承载起了甘肃省医保信息平台数十个业务系统的数字底座。能成为中医药强省医保数字化改革的信赖之选,华为云数据库有强大优势。首先,华为云数据库基于华为累积多年的数据库研发经验而打造,大幅优化了传统数据库,提供更高可用、更高性能、更高安全的数据库服务,完全满足国家医保局对于数据库的使用要求。不仅如此,华为云数据库还具备分库分表的能力,可通过增加节点实现性能和容量的线性增长,而且单集群数据库性能可达百万级QPS,最高可实现PB级的存储容量,足以轻松应对平台业务并发量高、数据量大的问题。更重要的是,数据库基于其高可用架构,能够实力保障在平台出现故障时做到同数据中心故障自动秒级切换,并且通过数据复制服务DRS实现跨Region数据完整灾备,遇到故障时能够游刃有余地保障业务的连续性和安全性。新平台面貌焕然一新在华为云数据库的高效支撑下,甘肃省医疗保障信息平台于2021年5月在兰州市全面上线运行。自上线以来,平台一直处于平稳运行状态。从新平台的实际运行效果来看,其门诊结算系统响应速度从单次平均5秒提高到了单次平均0.9秒,入院办理系统响应速度从单次平均3秒提高到单次平均0.4秒,住院结算系统响应速度从单次平均10秒提高到单次平均1.9秒。业务请求端到端时延得到了可视化的提高,大幅度减少了群众就医结算的等待时间。此外,为了顺利完成项目交付,华为云数据库团队驻扎到现场,深入甘肃省医疗保障局的实际业务场景,联合ISV厂家一起投入到项目中,并制定了业务库表设计规范、分库分表最佳实践、业务系统上线变更规范、数据库运维管理规范等。华为云数据库团队严格遵循国家医疗保障信息平台有关标准规范和要求,为国家医保信息平台在全国其他地方的落地提供了借鉴经验。【重磅活动推荐】开年采购享好价!华为云数据库MySQL、GaussDB(for Redis)18元/年限量秒杀,不限新老用户包年3折起。活动期间还有8000元大礼包、满额赠华为笔记本、0门槛抽奖等多重福利!https://activity.huaweicloud.com/dbs_Promotion/index.html
  • [交流吐槽] 【数据库】云数据库rds是什么意思?有什么优势?
    云数据库rds是什么意思?有什么优势?这两个问题是很多运维人员都想了解的问题,因为大多运维人员思想还停留在自建数据库这种意识上,并没有真正地了解到云数据库的优势,今天跟小编小编一起来简单了解一下。云数据库rds是什么意思?云数据RDS是关系型数据库服务(Relational Database Service)的简称,是一种即开即用、稳定可靠、可弹性伸缩的在线数据库服务;具有多重安全防护措施和完善的性能监控体系,并提供专业的数据库备份、恢复及优化方案,使您能专注于应用开发和业务发展。云数据库rds有什么优势?1、轻松部署使用云数据库RDS可以让用户轻松地完成数据库的申请和创建,只需要在几分钟内就可以部署投用,并且用户还可以通过rds控制台来对所有的实例进行统一管理,轻松完成部署。2、高可靠性在高可靠性方面表现得也很有优势,是可以进行故障自动单点切换,可以进行自动备份,能够确保高可用性和安全性。3、低成本用户可以根据自己的实际需求来支付费用,可以用最低的价格得到自己想要的一整套专业的数据库支持服务。4、高安全提供白名单访问策略;可自行设置允许访问的IP及IP段,有效防止黑客扫描端口进行服务器攻击等等。不同厂商的安全策略不同。知识拓展1:华为云-云数据库RDS简单介绍华为云-云数据库RDS服务具有完善的性能监控体系和多重安全防护措施,并提供了专业的数据库管理平台, 让用户能够在云上轻松的进行设置和扩展云数据库。通过云数据库RDS服务的管理控制台,用户无需编程就可以执行所有必需任务,简化运营流程,减少日常运维工作量,从而专注于开发应用和业务发展。知识拓展2:行云管家数据库审计支持云厂商RDS行云管家数据库审计全面支持Oracle、MySQL、SQLServer等主流数据库的审计和保护功能,同时适用于本地数据库与云厂商RDS。简单来说就是行云管家数据库审计支持云厂商RDS。
总条数:370 到第
上滑加载中