• [技术干货] 初步认识事务
    事务的定义数据库事务(Transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。事务的特性事务拥有四大特性,分别为原子性、一致性、隔离性、持久性:1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。栗子:就拿最经典的转账来举例子,A账户给B账户转账200元,那么就是A账户-200元,B账户+200元。如果这两条sql都执行成功,那么转账操作就会成功,如果有一条sql操作失败,那么转账操作就都失败了。// 开启事务,这是推荐的操作  start transaction  update 账户表 set 金额 = 金额 - 100 where name = 'A';  update 账户表 set 金额 = 金额 + 100 where name = 'B';  if Error then         rollback  else         commit2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。通俗的来讲就是数据执行前后数据需要保持一致。栗子:还是用转账案例来讲。账户A有1000元,账户B有1000元。账户A给账户B转账200元。sql执行完毕之后,那么账户A和账户B最后的总金额是2000元保持不变。3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。通俗的来讲就是,多个事务并发执行的时候,一个事务不影响另一个事务的操作。比如要查看数据更新的状态,那么事务A将查看的数据是事务B更新之前或更新之后的数据,不会看到该数据中间的状态。栗子:账户A有1000元,账户B有1000元,账户C有1000元。在同一事务中,账户A给账户B转账200元,账户C给账户B转账100元。那么事务A去查询账户B的余额,只会看到账户B的余额为转账之前的1300元或者是转账之前的1000元,不会看到其他的结果。4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。并发写事务会产生的问题1、脏读:事务A读取了事务B中没有提交的数据。栗子:哈哈,还是转账的栗子。账户A中有1000元,开始事务A,账户A取走200元,没有提交,这时候切换到事务B中,事务B查看账户A余额,此时查看到账户A中的余额还是1000元,因为事务A没有提交,所以产生了脏读。2、不可重复读:在一个事务里面读取了两次某个数据,读出来的数据不一致。栗子:还是这个栗子。事务A开启事务,查看账户A中的余额为1000元,此时切换到事务B中,事务B开启事务,对取走账户A中的200元,提交。此时切换到事务A中,查看到账户A余额为800元,事务A两次读取到的数据不一致。这就是不可重复读。3、幻读:在一个事务里面的操作中发现了未被操作的数据。
  • [问题求助] 关于mysql数据库的tpccrunner性能
    最近拿到手一台128核心的taishan200服务器,上边部署了一个mysql5.7的数据库。通过鲲鹏的数据库解决方案对其进行调优,但是解决方案上并没有给出性能指标。想知道对于128核心的服务器,mysql的tpccrunner的测试值应当为多少,或者说理论为多少?
  • [技术干货] AI训练营|基础课之图数据库第一讲
    大家看剧吃瓜是不是有这种烦恼,追几十集却一直懵逼复杂的人物关系?人物间隐藏的某种关系,让你觉得出乎意料又好像在情理之中,暗搓搓的关系线其实早已埋下 **如何用AI的方法快速理清人物关系?** 例如当看到这行内容: 东汉末年,孙权、刘备联军,曾在赤壁一带以火攻敌船之计大破曹军 当把各阵营之间的关系抽象一下,就会得到这样一张图 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/forums/attachment/forum/202103/10/183341ioqlbhezo4dnxzk1.png) 我们把这种存储实体和实体之间关系的数据结构称为图(Graph) 看到这里,好学的同学们会问, 用什么工具去处理图这种数据结构呢?欢迎华为云EI图引擎专家:Ray博士为大家讲解今天的课程内容: **图数据库:存储图这种数据结构的数据库** 戳这里观看课程: https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_1751503979789811721 我们在【华为云AI】公众号内嵌入了简易版的图引擎小程序(仅适用于搜索三国人物关系) 点击华为云AI公众号首页的EI体验空间-发现关系体验这项技术点击图片直达EI体验空间 今天的课程到这里结束啦 往期课程回顾请看公众号文章底部https://mp.weixin.qq.com/s/ceOmp1SLf8IxVXLyroXUEA 关注华为云AI公众号 我们将会持续推送相关硬核课程! ![论坛结尾图.jpg](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/forums/attachment/forum/202103/10/183821gcmezujkgd5wrhpz.jpg)
  • [技术干货] 华为云PB级数据库GaussDB(for Redis)介绍第四期:高斯 Redis Geo的介绍与应用
    1、背景LBS(Location Based Service,基于位置的服务)有非常广泛的应用场景,最常见的应用就是POI(Point of Interest)的查询,例如用户查找附近的人,附近的餐厅,附近的外卖商家等等。LBS的实现需要数据库存储地理位置信息,开源Redis是一个功能强、效率高、使用方便的缓存数据库,实现了地理位置存储的功能,可以用于LBS的数据存储。开源Redis 3.2以上版本的Geo功能支持了地理位置信息存储管理,但是内存限制导致没有大规模应用。GaussDB(for Redis)(下文简称高斯Redis)兼容开源Redis的Geo功能,使用磁盘替代内存,突破了开源Redis的内存限制,可以完美解决Geo的大规模应用问题。2、开源Redis Geo介绍Redis的Geo功能支持如下 6 个 Geo 的相关操作:(1) geoadd:添加某个地理位置的坐标。(2) geopos:获取某个地理位置的坐标。(3) geodist:获取两个地理位置的距离。(4)  geohash:获取某个地理位置的geohash值。(5)  georadius:根据给定地理位置坐标获取指定范围内的地理位置集合。(6)   georadiusbymember:根据给定地理位置获取指定范围内的地理位置集合。Redis Geo功能的空间索引采用 GeoHash 原理,配合zset集合存储,查询效率接近 log(N)。3、为什么开源Redis Geo没有广泛应用?存储地理位置信息的应用非常广泛,而开源Redis Geo功能也可以存储地理位置信息,并且查询效率高,为什么没有得到大规模的应用呢?分析存储地理位置信息的场景,都有如下特点:1)数据量大大部分场景存储地理位置信息的数据量都是TB级以上的,开源Redis的数据全部存放在内存中,节点的内存大小固定,要支持大数据量的地理位置信息存储,必须增加节点数,这会造成成本过高、大集群维护困难等问题。2)数据持续增长随着用户的增长,地理位置信息的数据也在持续增长,要求底层存储能够无损扩容。但开源Redis扩容需要重新划分hash槽进行数据迁移,必定会影响业务。3)高并发读写开源Redis主从模式下只有主节点可写,主节点高并发数据写入、高并发数据读出,写入速度过高容易造成主从堆积,数据丢失。除此之外,还需要考虑备份恢复,数据一致性,扩容,高可用等数据库系统能力。1) 备份恢复开源Redis提供RDB和AOF方式备份数据,但当数据规模大时,RDB方式恢复的数据一致性和完整性较差,AOF方式数据恢复的效率低。2) 数据一致性开源Redis的主从采用异步复制,会出现数据不一致的情况。3) 高可用开源Redis如果同时挂掉一对主从节点,部分数据将不可用,容错能力弱。4、高斯Redis为什么合适?高斯Redis基于华为自研分布式存储系统DFV,支持PB级大规模的数据存储。解决了开源Redis高成本、存储数据量小、数据不一致等问题,具有秒扩容、超可用、强一致、低成本、自动备份、抗写能力强的优势。5、适用场景高斯Redis Geo功能适用于数据量大、读写频繁的场景。在外卖平台、点评平台、找房平台中,餐馆的数据、外卖骑手的数据、用户的数据、房源的数据这些数据随着用户增长,数据量过亿,对应的地理位置信息的数据量可到数TB级别,正是高斯Redis适用的场景。下面介绍在不同场景中Geo功能的应用。5.1外卖场景:(1)用户下完外卖订单后,使用geoadd命令加入骑手的位置。(2)使用geopos命令,用户可获得骑手的具体位置。(3)使用georadius/ georadiusbymember命令骑手查看附近可配送的订单。(4)使用geodist命令用户可获得骑手的距离。5.2点评场景:(1)新的店铺加入点评平台,使用geoadd命令,添加新店铺的位置。(2)使用geopos命令,用户获得店铺的具体位置。(3)使用geodist命令,用户可获得与店铺的距离。(4)使用georadius/ georadiusbymember,用户可查找距离500米范围的店铺。5.3找房场景:(1)新的房源加入房源平台中,使用geoadd命令,添加新房源的位置。(2)使用geopos命令,用户可获得房源的具体位置。(3)使用geodist命令,用户可获得与房源的距离。(4)使用georadius/ georadiusbymember命令,用户查找附近1km范围内的房源。6、总结开源Redis的Geo功能查询效率高,但存在存储容量小、抗写能力弱、可用性差等明显缺点,导致了其Geo功能一直没有广泛应用。高斯Redis突破了开源Redis的内存限制,以高性能磁盘存储数据,具有秒扩容、超可用、强一致、低成本、自动备份、抗写能力强的特点,因此高斯Redis适用于大量地理位置信息存储的场景。7、结束本文作者:华为云高斯Redis团队。杭州西安深圳简历投递:yuwenlong4@huawei.com更多技术文章,关注高斯Redis官方博客:https://bbs.huaweicloud.com/community/usersnew/id_1614151726110813 PS:值此开年采购季之际,企业新用户购买GaussDB (for Redis)4U16G任意存储规格,内存可享3个月3折。另外还有多款云数据库包年低至2.7折,0门槛抽千元大奖、新购满额送华为手机P40 Pro 5G等多重福利,链接:https://activity.huaweicloud.com/dbs_Promotion/index.html
  • [技术干货] MySQL缓存的查询和清除命令使用分享
    Mysql 查询缓存查询缓存的作用就是当查询接收到一个和之前同样的查询,服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询。这样就大大提高了性能,节省时间。1.配置查询缓存修改配置文件,修改[mysqld]下的query_cache_size和query_cache_type(如果没有则添加)。其中query_cache_size表示缓存的大小,而query_cache_type有3个值,表示缓存那种类  型的select结果集,query_cache_type各个值如下:0或off关闭缓存1或on开启缓存,但是不保存使用sql_no_cache的select语句,如不缓存select  sql_no_cache name from wei where id=22或demand开启有条件缓存,只缓存带sql_cache的select语句,缓存select  sql_cache name from wei where id=4例子的配置为下,配置完成重启Mysql服务器即可。query_cache_size=10M query_cache_type=1 可以用如下命令查看是否开启,其中have_query_cache为是否开启,query_cache_limit 指定单个查询能够使用的缓冲区大小,缺省为1M;query_cache_min_res_unit为系统分配的最小缓存块大小,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据 查询,就容易造成内存碎片和浪费;query_cache_size和query_cache_type就是上面我们的配置;query_cache_wlock_invalidate表示当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。mysql> show variables like '%query_cache%'; +------------------------------+----------+ | Variable_name        | Value  | +------------------------------+----------+ | have_query_cache       | YES   | | query_cache_limit      | 1048576 | | query_cache_min_res_unit   | 4096   | | query_cache_size       | 10485760 | | query_cache_type       | ON    | | query_cache_wlock_invalidate | OFF   | +------------------------------+----------+ 6 rows in set (0.00 sec) 2.测试我们先执行一次,select  count(*) from wei ;然后再执行一次,可以看出第二次用的时间远远低于第一次的执行,因为第二次从缓存中读取了select结果。mysql> select count(*) from wei ; +----------+ | count(*) | +----------+ | 4194304 | +----------+ 1 row in set (3.92 sec) mysql> select count(*) from wei ; +----------+ | count(*) | +----------+ | 4194304 | +----------+ 1 row in set (0.00 sec) 我们可以通过如下命令查看现在缓存的情况mysql> show status like 'qcache%'; +-------------------------+----------+ | Variable_name      | Value  | +-------------------------+----------+ | Qcache_free_blocks   | 1    | | Qcache_free_memory   | 10475424 | | Qcache_hits       | 1    | | Qcache_inserts     | 1    | | Qcache_lowmem_prunes  | 0    | | Qcache_not_cached    | 0    | | Qcache_queries_in_cache | 1    | | Qcache_total_blocks   | 4    | +-------------------------+----------+ 8 rows in set (0.00 sec) 其中各个参数的意义如下:Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。Qcache_free_memory:缓存中的空闲内存。Qcache_hits:每次查询在缓存中命中时就增大Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个 数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。Qcache_total_blocks:缓存中块的数量。清除缓存mysql的FLUSH句法(清除缓存)FLUSH flush_option [,flush_option]如果你想要清除一些MySQL使用内部缓存,你应该使用FLUSH命令。为了执行FLUSH,你必须有reload权限。flush_option可以是下列任何东西:HOSTS       这个用的最多,经常碰见。主要是用来清空主机缓存表。如果你的某些主机改变IP数字,或如果你得到错误消息Host ... isblocked,你应该清空主机表。当在连接MySQL服务器时,对一台给定的主机有多于 max_connect_errors个错误连续不断地发生,MySQL为了安全的需要将会阻止该主机进一步的连接请求。清空主机表允许主机再尝试连接。LOGS        关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。PRIVILEGES  这个也是经常使用的,每当重新赋权后,为了以防万一,让新权限立即生效,一般都执行一把,目地是从数据库授权表中重新装载权限到缓存中。TABLES       关闭所有打开的表,同时该操作将会清空查询缓存中的内容。FLUSH TABLES WITH READ LOCK   关闭所有打开的表,同时对于所有数据库中的表都加一个读锁,直到显示地执行unlock tables,该操作常常用于数据备份的时候。STATUS       重置大多数状态变量到0。MASTER        删除所有的二进制日志索引文件中的二进制日志文件,重置二进制日志文件的索引文件为空,创建一个新的二进制日志文件,不过这个已经不推荐使用,改成reset master 了。可以想象,以前自己是多土啊,本来一条简单的命令就可以搞定的,却要好几条命令来,以前的做法是先查出来当前的二进制日志文件名,再用purge 操作。QUERY CACHE   重整查询缓存,消除其中的碎片,提高性能,但是并不影响查询缓存中现有的数据,这点和Flush table 和Reset Query  Cache(将会清空查询缓存的内容)不一样的。SLAVE        类似于重置复制吧,让从数据库忘记主数据库的复制位置,同时也会删除已经下载下来的relay log,与Master一样,已经不推荐使用,改成Reset Slave了。这个也很有用的。  一般来讲,Flush操作都会记录在二进制日志文件中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不会记录,因此上述操作如果记录在二进制日志文件中话,会对从数据库造成影响。
  • [运维管理] dmp文件如何导入到gaussdb数据库
    从oracle导出来的数据文件格式是dmp的,想使用GDS将数据导入到GaussDB,但是GDS只支持CSV、TEXT、FIXED的数据格式,有什么好的办法吗?
  • [方案构建] 【RDS for PG知识树】如何在方案中采用RDS for PG,你要的都在这里
    大类子类/使用场景文档名链接产品介绍文档RDS   for PG产品介绍华为云数据库PostgreSQL主打胶片   - 20202423《附件1:华为云数据库PostgreSQL主打胶片   - 20202423》云数据库PG增强版主打胶片《附件2:华为云数据库-PG增强版》华为云数据库PostgreSQL功能详解https://support.huaweicloud.com/usermanual-rds/rds_09_0000.html云数据库PostgreSQL增强版功能详解https://support.huaweicloud.com/usermanual-rds/rds_03_0018.html选型文档适用的场景及产品性能/兼容/对比特点华为云RDS   for pg选型参考《附件3:华为云RDS   for pg选型参考》华为云RDS for pg性能测试数据https://support.huaweicloud.com/pwp-rds/rds_03_0011.htmlPG与oracle数据库差异点《附件4:华为云数据库-PG   vs Oracle》适配/构建场景文档购买RDS   for pg购买指导https://support.huaweicloud.com/qs-rds/rds_03_0065.html新建RDS for pg,直接连接访问RDS for pg实例连接方式介绍https://support.huaweicloud.com/qs-rds/rds_03_0060.htmlRDS for pg内网连接操作指导https://support.huaweicloud.com/qs-rds/rds_02_0014.html    https://support.huaweicloud.com/qs-rds/rds_02_0016.htmlRDS for pg公网连接操作指导https://support.huaweicloud.com/qs-rds/rds_02_0015.html    https://support.huaweicloud.com/qs-rds/rds_02_0003.html    https://support.huaweicloud.com/qs-rds/rds_02_0051.htmlRDS for pg数据管理服务DAS连接操作指导https://support.huaweicloud.com/qs-rds/rds_03_0064.htmlRDS for pg通过JDBC连接操作指导https://support.huaweicloud.com/rds_faq/rds_faq_0050.htmloracle数据库迁移到RDS for PG数据库Oracle迁移RDS   forPG流程和方法论《附件5:华为云数据库Oracle迁移解决方案-PG增强版》Oracle迁移RDS forPG数据库改造操作指导和常见问题《附件9:Oracle迁移到华为云增强版PG改造建议手册》    参考:    《附件6:云数据库Oracle迁移PG增强版流程介绍》    《附件7:UGO让你秒变数据库和应用迁移专家_v2.0(暂未上线).pptx》    《附件8:数据库迁移计划 - 模板》使用DRS迁移云下Oracle数据到RDS for pg《附件10:DRS迁移-Oracle to PG》本地自建pg/云服务器自建pg/非华为云pg云数据库迁移到华为RDS   for PG使用DRS迁移云下PostgreSQL数据到RDS   for pg使用psql命令迁移云下PostgreSQL数据到rds for pghttps://support.huaweicloud.com/usermanual-rds/rds_09_0023.html数据库使用应用调用数据库(创建、备份恢复、参数配置等)API调用https://support.huaweicloud.com/api-rds/rds_00_0011.html参考材料工具JDBC下载链接https://jdbc.postgresql.org/download.html JDBC接口使用指南https://jdbc.postgresql.org/documentation/head/index.htmlPostgreSQL客户端https://support.huaweicloud.com/rds_faq/rds_faq_0029.html官方手册PG中文手册http://www.postgres.cn/docs/11/咨询与求助论坛沃土云创论坛https://bbs.huaweicloud.com/forum/forum-1343-1.html在线客服智能客服https://console.huaweicloud.com/smartadvisor/后台工单问题工单https://console.huaweicloud.com/ticket/?region=cn-east-2#/ticketindex/createIndex
  • [热门活动] 一站到底,寻找最“库”工程师
    五重闯关挑战,谁是最“库”工程“狮”,来华为云数据库直播间,挑战一站到底,不但有闯关团陪你闯关,还有神秘专家团带你解读数据库上云的那些坑和未来发展趋势,更有一年一度骨折价数据库产品等你发现噢~想得华为mate40 Pro、双肩包、华为云定制卫衣等豪礼,3月9日15:40锁定华为云数据库直播间,我们不见不散~  立戳:https://activity.huaweicloud.com/dbs_Promotion/index.html  
  • [技术干货] Android批量插入数据到SQLite数据库的方法
    Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知。因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度。有时需要把一些数据内置到应用中,常用的有以下几种方式:1、使用db.execSQL(sql)这里是把要插入的数据拼接成可执行的sql语句,然后调用db.execSQL(sql)方法执行插入。public void inertOrUpdateDateBatch(List<String> sqls) { SQLiteDatabase db = getWritableDatabase(); db.beginTransaction(); try { for (String sql : sqls) { db.execSQL(sql); } // 设置事务标志为成功,当结束事务时就会提交事务 db.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { // 结束事务 db.endTransaction(); db.close(); } } 2、使用db.insert("table_name", null, contentValues)这里是把要插入的数据封装到ContentValues类中,然后调用db.insert()方法执行插入。db.beginTransaction(); // 手动设置开始事务 for (ContentValues v : list) { db.insert("bus_line_station", null, v); } db.setTransactionSuccessful(); // 设置事务处理成功,不设置会自动回滚不提交 db.endTransaction(); // 处理完成 db.close() 3、使用InsertHelper类这个类在API 17中已经被废弃了InsertHelper ih = new InsertHelper(db, "bus_line_station"); db.beginTransaction(); final int directColumnIndex = ih.getColumnIndex("direct"); final int lineNameColumnIndex = ih.getColumnIndex("line_name"); final int snoColumnIndex = ih.getColumnIndex("sno"); final int stationNameColumnIndex = ih.getColumnIndex("station_name"); try { for (Station s : busLines) { ih.prepareForInsert(); ih.bind(directColumnIndex, s.direct); ih.bind(lineNameColumnIndex, s.lineName); ih.bind(snoColumnIndex, s.sno); ih.bind(stationNameColumnIndex, s.stationName); ih.execute(); } db.setTransactionSuccessful(); } finally { ih.close(); db.endTransaction(); db.close(); } 4、使用SQLiteStatement查看InsertHelper时,官方文档提示改类已经废弃,请使用SQLiteStatementString sql = "insert into bus_line_station(direct,line_name,sno,station_name) values(?,?,?,?)"; SQLiteStatement stat = db.compileStatement(sql); db.beginTransaction(); for (Station line : busLines) { stat.bindLong(1, line.direct); stat.bindString(2, line.lineName); stat.bindLong(3, line.sno); stat.bindString(4, line.stationName); stat.executeInsert(); } db.setTransactionSuccessful(); db.endTransaction(); db.close(); 第三种方法需要的时间最短,鉴于该类已经在API17中废弃,所以第四种方法应该是最优的方法。
  • [热门活动] 看直播,瓜分46万,快来围观呀!
    想玩好玩的游戏,还想拿礼物?快来云数据库专场直播间, 听主播细讲数据库趣事,瓜分46万数据库上云大礼包,特惠云数据库产品限时抢,互动闯关成功还有机会赢取Mate 40 Pro,3月9日15:40,不见不散。  戳此锁定直播间:https://www.huaweicloud.com/about/shangyun.html  
  • [热门活动] 【开年狂欢季】华为云数据库开年采购全攻略
    数据库要上云?快来领《华为云数据库开年采购全攻略》,优惠福利先知道:云数据库特价套餐低至2.7折,访问云数据库专场即可抽奖, 先抢50万云数据库专属红包,看直播再享折上折,下单满额送手机P40 Pro等大礼。  点击开启上您的上云狂欢季:https://activity.huaweicloud.com/dbs_Promotion/index.html  
  • [热门活动] 开年采购活动来了!爆款云数据库2.7折起,满额还送华为手机P40 Pro 5G
     让企业核心数据安全上云,稳定高效处理与分析,我们是认真的!来开年采购季·云数据库专场,畅享一站式数据上云服务。爆款云数据库2.7折起,新购满额送华为手机P40 Pro 5G!现在点击链接还可以参与抽奖!有机会赢取价值千元礼品!→https://activity.huaweicloud.com/dbs_Promotion/index.html
  • [热门活动] 【开年采购季】填问卷,0门槛抽奖,100%中奖!移动电源、U盘、懒人手机支架等你哟!
    活动时间:2020/3/5~3/31活动主题:开年采购季,全年最低价,0门槛抽奖,100%中奖!活动内容:填问卷,奖品送不停&0门槛抽奖,100%中奖!活动1:【开年采购季-华为云数据库】填问卷,截图盖楼就有礼参与方式:填写问卷,将问卷完成的截图页面发布在评论区问卷链接:https://devcloud.huaweicloud.com/expert/open-assessment/qtn?id=2bc7c8d3cd474ae8b2e6b209f4bcfbdf回帖方式:华为云账号+问卷结束页截图奖励方式:有效盖楼层数>300层,奖品如下:每100层,随机抽取5个幸运用户,送高硼玻璃杯一个,以此类推;超过100层,增加1个抽奖名额,送移动电源;超过200层,增加1个抽奖名额,送32GU盘;超过300层,增加1个抽奖名额,送懒人手机支架;奖品送不停:注:1.有效盖楼是指,与活动主题相关的回复2.为保障中奖用户的公平性,出现重复中奖的用户自动延续到下一位。活动2:【华为云开年采购季-云数据库专场】0门槛抽奖,100%中奖!入口1:长按识别调查问卷结束页二维码截图,即可进入入口2:点击【云数据库专场】也可进入【立刻购买】爆款数据库2.7折起,让企业核心数据安全上云【返回主会场】0门槛抽奖,100%中奖!活动3:【数据库·微话题】“GaussDB(for Influx)时序数据库”知多少,U盘、笔记本、玻璃杯送不停!提示:1.本次活动回帖内容需满足华为云论坛发帖规范 https://bbs.huaweicloud.com/forum/thread-23077-1-1.html。2. 活动结束3个工作日将在此帖公布获奖名单,敬请关注。3. 奖品将在公示期结束后15个工作日内发出。4. 由于获奖用户自身原因(包括但不限于提供的联系方式有误、身份不符或者通知领奖后超过15个工作日未领取等)造成奖品无法发送的,视为获奖用户放弃领奖。5.活动一切解释权归华为云数据库所有。
  • [数据安全] 数据库安全服务和数据安全中心,都可以做数据脱敏,什么情况下选择哪一个合适?
    如题,请专家解答下
  • [技术干货] python csdn自动关注
    import timeimport pymysql  # pymysql数据库from fake_useragent import UserAgentimport requests as request  # 网络请求requestimport json userName = ""  # 设置自己用户名称token = ""  # 查看网页中cookies中的token  class CsdnSpider(object):     def __init__(self):        global userName        global token        self.cookices = {            "UserName": userName,  # 设置自己用户名称            "UserToken": token,  # 设置登录token        }        self.us = UserAgent()        self.head = {            "User-Agent": self.us.random,        }        self.seesion = request.Session()        self.url = "https://blog.csdn.net//phoenix/web/v1/follow/list?page=1&pageSize=40&blogUsername="        self.help = MysqlHelp()     def parse_html(self, name):        json_str = self.get_url(name.replace(" ", ""))        user_dic = json.loads(json_str)        data = user_dic["data"]        print(data is None)        if data is not None:            follow = data["total"]            print("关注:", follow)            if follow != 0:                for user in data["list"]:                    time.sleep(0.5)                    username = user["username"]                    nickname = user["nickname"]                    blogUrl = user["blogUrl"]                    years = user["years"]                    print("插入数据", nickname)                    list = self.help.select_data_user(nickname)                    if len(list) == 0:  # 判断数据库中有没有这个名字                        self.help.insert_data_user(username, nickname, blogUrl, years, follow)                        self.post_url(nickname)                        self.parse_html(nickname)                    else:                        print("已经插入过:", nickname)     def get_url(self, name):        print("获取网址:", self.url + name)        respon = self.seesion.get(url=self.url + name, headers=self.head, cookies=self.cookices)        # print("请求网址响应:" + respon.content.decode('utf-8'))        return respon.content.decode('utf-8')     def post_url(self, name):        data = {            "username": name        }        response = request.post('https://me.csdn.net/api/relation/create?source=blog', data=json.dumps(data),                                cookies=self.cookices)        if response.status_code == 200:            print("关注成功")        else:            print("关注失败状态码:", response.status_code)     def run(self):        self.parse_html("qq_41329275") #连接MySql数据库coon = pymysql.connect(    host="127.0.0.1",    # 你的主机    user="root",    # 你的数据库用户名    password="root",    # 本次操作所要使用的数据库    database="spiderdb",    charset="utf8",)# 获取数据库操作游标cursor = coon.cursor()  class MysqlHelp(object):      #插入数据    def insert_data_user(self, username, nickname, userAvatar, years, follow):        global cursor, coon        insertSql = 'insert into csdn_user(username,nickname,blogUrl,years,follow) value (%s,%s,%s,%s,%s)'        cursor.execute(insertSql, (username, nickname, userAvatar, years, follow))        # self.cursor.executemany(sql,data) #批量添加数据        coon.commit()        lastId = cursor.lastrowid        print("lastId", lastId)     def select_data_user(self, nickname):        global cursor, coon        selectSql = 'select nickname from csdn_user where nickname=' + "'" + nickname + "'"        cursor.execute(selectSql)        list = cursor.fetchall()        print("数据库种nickName:", list)        return list     # 关闭数据库    def close_db(self):        cursor.close()        coon.close()  if __name__ == '__main__':    spider = CsdnSpider()    spider.run()