• [典型案例] 【转】中标麒麟+Qt+mysql解决驱动无法加载的问题
    问题描述:都安装了Qt,Mysql之后,发现Qt始终不能连接Mysql1、安装Qt2、写程序直接连接QMysql打印QSqlDatabase: * driver not loaded ,进入/home/rainbow/zhuxy/soft/Qt/5.8/gcc_64/plugins/sqldrivers,发现有mysql的so,这是Qt提供给我们的动态库,我们通过这个动态库增删改查数据库,具体的实现,是在这个so里调用了Mysql的so..3、ldd Qt的动态库,ldd libqsqlmysql.so发现libmysqlclient.so.18(QMysql的so)not found,说明没有Mysql的环境4、安装Mysql的动态库sudo yum -y install wgetsudo wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpmsudo rpm -ivh mysql-community-release-el7-5.noarch.rpmsudo yum install mysql-devel 保险起见:yum install mysql*5、再次运行程序应该可以了,如果发现访问出现问题,关闭防火墙,修改localhost为%mysql -u root -pmysql>use mysql;mysql>select 'host' from user where user='root';mysql>update user set host = '%' where user ='root';mysql>flush privileges;mysql>select 'host'   from user where user='root';重启电脑转自:https://www.cnblogs.com/judes/p/11788503.html
  • [技术干货] MySQL客户端连接实例后会自动断开解决办法
    故障描述MySQL客户端连接实例后,会自动断开,报错信息:“ERROR 2013:Lost connection to MySQL server during query”。解决方案ERROR 2013是MySQL常见错误,一般为配置错误导致。“wait_timeout”:服务器关闭非交互连接之前等待活动的秒数。“interactive_timeout”:服务器关闭交互连接之前等待活动的秒数。查看实例状态是否处于正常状态。       经查看实例状态正常,继续排查其他问题。2.查看错误日志。3.使用MySQL命令行客户端连接数据库,执行status命令,确认数据库实例是否重频繁重启Uptime代表实例的运行时间,从排查结果可知,数据库并没有频繁重启,因而,客户端连接被断开,不是因数据库重启引起的。4.查看“wait_timeout”和“interactive_timeout”参数设置,当数值设置过小时,MySQL会自动断开超时的空连接。5.您可根据实际应用需求量,修改“wait_timeout”和“interactive_timeout”参数值,无需重启实例。6.恢复结果确认,等到10分钟左右,再次执行show databases命令,确认连接是否正常如图所示,说明连接正常。
  • [技术干货] Mysql主从数据库(Master/Slave)同步配置与常见错误
    随着访问量的增加,对于一些比较耗时的数据库读取操作,一般采用将写入与读取操作分开来缓解数据库的压力,数据库引擎一般采用Master/Slave架构。实现mysql服务器的主从配置,可以实现读写分离,另外在主数据库崩溃后可以从备用数据库中恢复数据以不至于网站中断访问。下面简单说下mysql主从服务器配置的过程。首先需要在同一个局域网内的两台机器(当然也可以用一台机器虚拟两台机器出来),都安装上mysql服务。主机A: 192.168.1.100从机B: 192.168.1.101可以有多台从机。1、先登录主机 A,执行如下命令赋予从机权限,如果有多台丛机,就执行多次:mysql>GRANT REPLICATION SLAVE ON *.* TO 'backup'@'192.168.1.101' IDENTIFIED BY '123456';2、 打开主机A的my.cnf,输入如下配置参数:server-id = 1 #主机标示,整数 log_bin = /var/log/mysql/mysql-bin.log #确保此文件可写 read-only =0 #主机,读写都可以 binlog-do-db =test #需要备份数据,多个写多行 binlog-ignore-db =mysql #不需要备份的数据库,多个写多行3、打开从机B的my.cnf,输入如下配置参数:server-id = 2 log_bin = /var/log/mysql/mysql-bin.log master-host =192.168.1.100 master-user =backup master-pass =123456 master-port =3306 master-connect-retry=60 #如果从服务器发现主服务器断掉,重新连接的时间差(秒) replicate-do-db =test #只复制某个库 replicate-ignore-db=mysql #不复制某个库4、同步数据库进过以上的配置,分别重启主机A和从机B,即可自动实现同步。5、验证在主机A中,mysql>show master status\G;能看到大致这些内容File: mysql-bin.000001 Position: 1374 Binlog_Do_DB: test Binlog_Ignore_DB: mysql在从机B中,mysql>show slave status\G;显示内容如下图所示:可以看到Slave_IO_State项为Waiting for master to send event且红圈中两项皆为Yes,那么基本上可以确定是配置成功了另外可以在主机A中,做一些INSERT, UPDATE, DELETE 操作,看看主机B中,是否已经被修改。常见错误1、master发生故障,经修复后启动后,slave无法与master同步报错:Got fatal error 1236 from master when reading data from binary log原因:master重启后,mysql的binlog会重新生成,相应的记录位置会改变解决方法:-master:mysql > flush logs; mysql > show master status;记录下File和Position值-slave:mysql > reset slave; mysql > change master to master_host='192.168.10.100',master_user='test',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=106; mysql > start slave; mysql > show slave status\G;
  • [技术干货] 通过数据管理服务DAS连接MySQL实例
    步骤一:购买实例操作场景本节将介绍在云数据库RDS服务的管理控制台购买实例的过程。RDS for MySQL支持“包年/包月”和“按需计费”购买,您可以根据业务需要定制相应计算能力和存储空间的云数据库RDS实例。RDS for MySQL支持购买主备实例或单实例时可以批量同步购买只读实例,您可以根据业务需要进行购买。前提条件已注册华为云账号。注册华为云账号后,如果需要对华为云上的资源进行精细管理,请使用统一身份认证服务(Identity and Access Management,简称IAM)创建IAM用户及用户组,并授权,以使得IAM用户获得具体的操作权限,更多操作,请参见创建用户组、用户并授予RDS权限。账户余额大于等于0元。操作步骤登录管理控制台。单击管理控制台左上角的定位图标,选择区域和项目。选择“数据库 > 云数据库 RDS”。进入云数据库 RDS信息页面。在“实例管理”页面,单击“购买数据库实例”。在“服务选型”页面,选择计费模式,填写并选择实例相关信息后,单击“立即购买”。步骤二:通过DAS连接MySQL实例操作场景华为云数据管理服务(Data Admin Service,简称DAS)是一款专业的简化数据库管理工具,提供优质的可视化操作界面,大幅提高工作效率,让数据管理变得既安全又简单。您可以通过数据管理服务连接并管理实例。华为云关系型数据库服务默认为您开通了远程主机登录权限,推荐您使用更安全便捷的数据管理服务连接实例。操作步骤登录管理控制台。单击管理控制台左上角的定位图标,选择区域和项目。选择“数据库 > 云数据库 RDS”。进入云数据库 RDS信息页面。在“实例管理”页面,选择目标实例,单击操作列的“登录”,进入数据管理服务实例登录界面。您也可以在“实例管理”页面,单击目标实例名称,在页面右上角,单击“登录”,进入数据管理服务实例登录界面。正确输入数据库用户名和密码,单击“登录”,即可进入您的数据库并进行管理。通过数据管理服务管理数据库可参见MySQL数据管理。
  • [技术干货] MySQL修改密码的几种方式
    1.忘记 root 密码忘记 root 密码的场景还是比较常见的,特别是自己搭的测试环境经过好久没用过时,很容易记不得当时设置的密码。这个时候一般常用的方法是跳过权限验证,然后更改 root 密码,之后再启用权限验证。以 MySQL 5.7 版本为例简单讲下主要过程:首先修改配置文件,在[mysqld]部分加上一句:skip-grant-tables ,加上此参数的目的是跳过权限验证。然后重启数据库,数据库再次启动后,我们就可以不用密码直接登录数据库修改密码了。# skip-grant-tables 模式下修改root密码  [root@host ~]# mysql  Welcome to the MySQL monitor.  Commands end with ; or \g.  Your MySQL connection id is 16  Server version: 5.7.23-log MySQL Community Server (GPL)    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.    Oracle is a registered trademark of Oracle Corporation and/or its  affiliates. Other names may be trademarks of their respective  owners.    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.    mysql> update mysql.user set authentication_string = password ('xxxxxx') where user = 'root' and host = 'localhost';  Query OK, 0 rows affected, 1 warning (0.00 sec)  Rows matched: 1  Changed: 0  Warnings: 1    mysql> flush privileges;  Query OK, 0 rows affected (0.01 sec)修改完 root 密码后,再次去除 skip-grant-tables 参数,然后重启下数据库即可。2.几种修改密码的方法除去忘记密码,可能还有其他情景需要修改密码,这时候就可以采取普通方式修改密码了。还是以 MySQL 5.7 版本为例,介绍几种常用的修改密码的方法。使用 alter user 修改比如如果想更改 testuser 账号的密码,我们可以使用 root 账号登录,然后执行 alter user 命令更改 testuser 账号的密码。mysql> alter user 'testuser'@'%' identified by 'Password1';  Query OK, 0 rows affected (0.01 sec)    mysql> flush privileges;  Query OK, 0 rows affected (0.00 sec)使用 SET PASSWORD 命令使用 SET PASSWORD 修改密码命令格式为 SET PASSWORD FOR 'username'@'host' = PASSWORD('newpass'); 同样是使用 root 账号可修改其他账号的密码。mysql> SET PASSWORD FOR 'testuser'@'%' = PASSWORD('Password2');  Query OK, 0 rows affected, 1 warning (0.00 sec)    mysql> flush privileges;  Query OK, 0 rows affected (0.00 sec)使用 mysqladmin 修改密码使用 mysqladmin 命令修改账号密码格式为 mysqladmin -u用户名 -p旧密码 password 新密码[root@host ~]# mysqladmin -utestuser -pPassword2 password Password3  mysqladmin: [Warning] Using a password on the command line interface can be insecure.  Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.  [root@host ~]# mysql -utestuser -pPassword3  mysql: [Warning] Using a password on the command line interface can be insecure.  Welcome to the MySQL monitor.  Commands end with ; or \g.  Your MySQL connection id is 2388  Server version: 5.7.23-log MySQL Community Server (GPL)    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.    Oracle is a registered trademark of Oracle Corporation and/or its  affiliates. Other names may be trademarks of their respective  owners.    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.    mysql>直接 update user 表其实 MySQL 所以的账号信息都存储在 mysql.user 表里面,我们也可以直接通过 update user 表来修改密码。# 5.7及之后版本  mysql> update mysql.user set authentication_string = password ('Password4') where user = 'testuser' and host = '%';  Query OK, 1 row affected, 1 warning (0.06 sec)  Rows matched: 1  Changed: 1  Warnings: 1    mysql> flush privileges;  Query OK, 0 rows affected (0.01 sec)    # 5.6及之前版本  update mysql.user set password=password('新密码') where user='用户名' and host='host';3.设置 login-path 本地快捷登陆为了防止密码暴露及忘记密码,我们还可以设置 login-path 来实现在本地不输密码快捷登录。login-path 是 MySQL 5.6 开始支持的新特性。通过借助 mysql_config_editor 工具将登陆 MySQL 服务的认证信息加密保存在 .mylogin.cnf 文件(默认位于用户主目录)。MySQL 客户端工具可通过读取该加密文件连接 MySQL ,实现快捷登录。假设我们想配置 root 账号在本地快捷登录,可以这么做:# 执行回车后需要输入一次root密码  [root@host ~]# mysql_config_editor set --login-path=root -uroot  -hlocalhost -p -P3306   Enter password:     # 配置完成后可以使用login-path登录  [root@host ~]# mysql --login-path=root  Welcome to the MySQL monitor.  Commands end with ; or \g.  Your MySQL connection id is 2919  Server version: 5.7.23-log MySQL Community Server (GPL)    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.    Oracle is a registered trademark of Oracle Corporation and/or its  affiliates. Other names may be trademarks of their respective  owners.    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.    mysql>
  • [技术干货] 安全地关闭MySQL
    停止复制在一些特殊环境下,slave节点可能会尝试从错误的位置(position)进行启动。为了减少这种风险,要先停止io thread,从而不接收新的事件信息。mysql> stop slave io_thread;等sql thread应用完所有的events之后,也将sql thread停掉。‘mysql> show slave status\G mysql> stop slave sql_thread;这样io thread和sql thread就可以处于一致性位置,这样relay log就只是包含被执行过的events,relay_log_info_repository中的位置信息也是最新的。对于开启了多线程复制的slave,确保在关闭复制之前,已经填充了gapsmysql> stop slave; mysql> start slave until sql_after_mts_gaps; #应用完relay log中的gap mysql> show slave status\G #要确保在之前已经停掉了sql_thread mysql> stop slave ;提交、回滚kill长时间运行的事务1分钟内可以发生很多事,在关闭时,innodb必须回滚未提交的事务。事务回滚的代价是非常昂贵的,可能会花费很长时间。任何事务回滚都可能意味着数据丢失,因此理想情况下关闭时没有打开任何事务。如果关闭的是读写的数据库,写操作应该提前路由到其他节点。如果必须关闭还在接收事务的数据库,下面的查询会输出运行时间大于60秒的会话信息。根据这些信息再决定下一步:mysql> SELECT trx_id, trx_started, (NOW() - trx_started) trx_duration_seconds, id processlist_id, user, IF(LEFT(HOST, (LOCATE(':', host) - 1)) = '', host, LEFT(HOST, (LOCATE(':', host) - 1))) host, command, time, REPLACE(SUBSTRING(info,1,25),'\n','') info_25 FROM information_schema.innodb_trx JOIN information_schema.processlist ON innodb_trx.trx_mysql_thread_id = processlist.id WHERE (NOW() - trx_started) > 60 ORDER BY trx_started; +--------+---------------------+----------------------+----------------+------+-----------+---------+------+---------------------------+ | trx_id | trx_started         | trx_duration_seconds | processlist_id | user | host      | command | time | info_25                   | +--------+---------------------+----------------------+----------------+------+-----------+---------+------+---------------------------+ | 511239 | 2020-04-22 16:52:23 |                 2754 |           3515 | dba  | localhost | Sleep   | 1101 | NULL                      | | 511240 | 2020-04-22 16:53:44 |                   74 |           3553 | root | localhost | Query   |   38 | update t1 set name="test" | +--------+---------------------+----------------------+----------------+------+-----------+---------+------+---------------------------+ 2 rows in set (0.00 sec)3.清空processlistmysql要断开连接并关闭了。我们可以手动帮助mysql一下。使用pt-kill查看并杀死活跃和睡眠状态的连接。这时应该不会有新的写连接进来。我们只是处理读的连接。pt-kill --host="localhost" --victims="all" --interval=10 --ignore-user="pmm|orchestrator" --busy-time=1 --idle-time=1 --print [--kill]这里可以选择性地排除某些用户建立的连接。4.配置innodb完成最大刷新(flush)SET GLOBAL innodb_fast_shutdown=0; SET GLOBAL innodb_max_dirty_pages_pct=0; SET GLOBAL innodb_change_buffering='none';disable掉innodb_fast_shutdown可能会使得关闭过程花费几分钟甚至个把小时,因为需要等待undo log的purge和changebuffer的merge。为了加速关闭,设置innodb_max_dirty_pages_pct=0并监控下面查询的结果。期望值是0,但并不总是能保证,如果mysql中还有活动的话。那么,查出的结果不再继续变小的话,就可以继续下一步了:SHOW GLOBAL STATUS LIKE '%dirty%';如果使用了pmm监控,可以查看“innodb change buffer”的图示5.转储buffer pool中的内容SET GLOBAL innodb_buffer_pool_dump_pct=75; SET GLOBAL innodb_buffer_pool_dump_now=ON;mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status'; +--------------------------------+--------------------------------------------------+ | Variable_name                  | Value                                            | +--------------------------------+--------------------------------------------------+ | Innodb_buffer_pool_dump_status | Buffer pool(s) dump completed at 200429 14:04:47 | +--------------------------------+--------------------------------------------------+ 1 row in set (0.01 sec)启动的时候,要想加载转储出的内容,要检查一下参数innodb_buffer_pool_load_at_startup的配置。6.刷日志FLUSH LOGS;现在,就可以关闭mysql了。大多时候,我们只是执行stop命令,MySQL关闭并重启都是很正常的。偶尔也会遇到一些问题。
  • [技术干货] Mysql跨表更新 多表update sql语句总结
    假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price;另外一张表是ProductPrice表,我们要将ProductPrice表中的价格字段Price更新为Price表中价格字段的80%。在Mysql中我们有几种手段可以做到这一点,一种是update table1 t1, table2 ts ...的方式:  UPDATE product p, productPrice pp  SET pp.price = pp.price * 0.8  WHERE p.productId = pp.productId  AND p.dateCreated < '2004-01-01'另外一种方法是使用inner join然后更新:  UPDATE product p  INNER JOIN productPrice pp  ON p.productId = pp.productId  SET pp.price = pp.price * 0.8  WHERE p.dateCreated < '2004-01-01'另外我们也可以使用left outer join来做多表update,比方说如果ProductPrice表中没有产品价格记录的话,将Product表的isDeleted字段置为1,如下sql语句:  UPDATE product p  LEFT JOIN productPrice pp  ON p.productId = pp.productId  SET p.deleted = 1  WHERE pp.productId IS null另外,上面的几个例子都是两张表之间做关联,但是只更新一张表中的记录,其实是可以同时更新两张表的,如下sql:  UPDATE product p  INNER JOIN productPrice pp  ON p.productId = pp.productId  SET pp.price = pp.price * 0.8,  p.dateUpdate = CURDATE()  WHERE p.dateCreated < '2004-01-01'
  • [问题求助] 【mysql产品】【功能libaio】一句话描述问题
    【操作步骤&问题现象】1、缺失libaio2、yum 访问404【截图信息】各位有libaio依赖包么,顺便帮我看看yum install 404的问题 谢谢
  • [技术干货] 2020-12-15:mysql的回滚机制是怎么实现的?
    2020-12-15:mysql的回滚机制是怎么实现的?#福大大架构师每日一题#
  • [技术干货] 将SQL语句映射为文件操作
    1. 查询数据表前面介绍过,在 MySQL 中无论哪种存储引擎的表都会有一个 .frm 文件来保存数据表的结构定义。所以,执行 SHOW TABLES; 语句相当于列出数据库目录中所有 .frm 文件的基本名,所得到的结果是相同的。有些数据库系统使用注册表来记录某数据库里的所有数据表,但 MySQL 没有这样做,因为,MySQL 数据目录的层次结构已经把“注册表”隐藏在其中了。2. 创建数据表创建数据表时,需要执行 CREATE TABLE 语句定义数据表的结构。无论是哪一种存储引擎,MySQL 服务器都将创建一个 .frm 文件来保存数据表的结构定义的内部编码。MySQL 服务器还会根据指定数据表的具体类型创建出其他必要的文件。例如,它将为一个 MyISAM 数据表创建出一个 .MYD 数据文件和一个 .MYI 索引文件;为一个 MERGE 数据表创建出一个 .mgr 数据/索引文件。对于 InnoDB 数据表,InnoDB 处理程序将在 InnoDB 表空间里为数据表初始化一些数据和索引信息。3. 更新数据表当执行 ALTER TABLE 语句时,MySQL 服务器将对相对应数据表的 .frm 文件重新进行编码,来表明数据表的结构性变化,还要对有关的数据文件和索引文件的内容进行相应的修改。CREATE INDEX 和 DROP INDEX 等语句也是对相应数据表的 .frm 文件重新进行编码,因为 MySQL 服务器在内部是把它们当作等效的 ALTER TABLE 语句来处理的。改变 InnoDB 数据表的结构会引起 InnoDB 处理程序修改 InnoDB 表空间中数据表的数据,同时也对索引做出相应的修改。4. 删除数据表DROP TABLE 语句是通过删除该相应数据表的各种有关文件而实现的。对于某些数据表类型,可以通过在相应的数据库目录里删除与数据表有关的各个文件的办法来手动删除这个数据表。例如,假设 mydb 是当前数据库,mytb1 是一个 MyISAM、Archive 或 MERGE 类型的数据表,那么 DROP TABLE mytb1 语句就大致等效于下面这两条命令:cd DATADIR(数据库文件存放路径)rm -f mydb/mytb1.* 或 del mydb/mytb1.*对于 InnoDB 数据表,因为它的某些组成部分在文件系统里没有实体性的文件代表,所以没有等效的文件系统命令。例如,InnoDB 数据表在文件系统里只有一个相应的 .frm 文件,用文件系统级命令删除这个文件后,该数据表在 InnoDB 表空间中对应的数据和索引将没有任何意义。
  • [技术干货] Mysql 存储过程中使用游标循环读取临时表
    游标游标(Cursor)是用于查看或者处理结果集中的数据的一种方法。游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。游标的使用方法定义游标:Declare 游标名称 CURSOR for table;(table也可以是select出来的结果集)打开游标:Open 游标名称;从结果集获取数据到变量:fetch 游标名称 into field1,field2;执行语句:执行需要处理数据的语句关闭游标:Close 游标名称;BEGIN   # 声明自定义变量   declare c_stgId int;   declare c_stgName varchar(50);   # 声明游标结束变量   declare done INT DEFAULT 0;   # 声明游标 cr 以及游标读取到结果集最后的处理方式   declare cr cursor for select Name,StgId from StgSummary limit 3;   declare continue handler for not found set done = 1;   # 打开游标   open cr;   # 循环   readLoop:LOOP     # 获取游标中值并赋值给变量     fetch cr into c_stgName,c_stgId;     # 判断游标是否到底,若到底则退出游标     # 需要注意这个判断     IF done = 1 THEN       LEAVE readLoop;      END IF;             SELECT c_stgName,c_stgId;        END LOOP readLoop;   -- 关闭游标   close cr; END声明变量Declare语句注意点:Declare语句通常用来声明本地变量、游标、条件或者handlerDeclare语句只允许出现在BEGIN...END语句中而且必须出现在第一行Declare的顺序也有要求,通常是先声明本地变量,再是游标,然后是条件和handler自定义变量命名注意点:自定义变量的名称不要和游标的结果集字段名一样。若相同会出现游标给变量赋值无效的情况。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表。与普通创建语句的区别就是使用 TEMPORARY 关键字CREATE TEMPORARY TABLE StgSummary(  Name VARCHAR(50) NOT NULL,  StgId INT NOT NULL DEFAULT 0 );临时表使用限制在同一个query语句中,只能查找一次临时表。同样在一个存储过程中也不能多次查询临时表。但是不同的临时表可以在一个query中使用。不能用RENAME来重命名一个临时表,但是可以用ALTER TABLE代替ALTER TABLE orig_name RENAME new_name;临时表使用完以后需要主动Drop掉DROP TEMPORARY TABLE IF EXISTS StgTempTable;存储过程中使用游标循环读取临时表数据BEGIN ## 创建临时表 CREATE TEMPORARY TABLE if not exists StgSummary(  Name VARCHAR(50) NOT NULL,  StgId INT NOT NULL DEFAULT 0 ); TRUNCATE TABLE StgSummary; ## 新增临时表数据 INSERT INTO StgSummary(Name,StgId) select '临时数据',1 BEGIN # 自定义变量 declare c_stgId int; declare c_stgName varchar(50); declare done INT DEFAULT 0; declare cr cursor for select Name,StgId from StgSummary ORDER BY StgId desc LIMIT 3; declare continue handler for not found set done = 1; -- 打开游标 open cr; testLoop:LOOP -- 获取结果 fetch cr into c_stgName,c_stgId; IF done = 1 THEN LEAVE testLoop;  END IF;       SELECT c_stgName,c_stgId; END LOOP testLoop; -- 关闭游标 close cr; End; DROP TEMPORARY TABLE IF EXISTS StgSummary; End;最开始的时候,先创建临时表,再定义游标。但是存储过程无论如何都保存不了。直接报错You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE ...根本原因就是上面提到的注意点(Declare语句只允许出现在BEGIN...END语句中而且必须出现在第一行)。所以最后只能多个加一对BEGIN...END进行隔开。
  • [技术干货] MySQL修改存储过程
    前言在实际开发中,业务需求修改的情况时有发生,这样,不可避免的需要修改存储过程的特征MySQL中,使用ALTER语句修改存储过程的特性语法格式ALTER {PROCEDURE | FUNCTION} sp_name [characteristic……]参数说明Sp_name,表示存储过程或函数的名称characteristic,表示要修改存储过程的哪个部分Characteristic的取值如下CONTAINS SQL,表示子程序包含SQL语句,但是,不包含读或写数据的语句NO SQL,表示子程序中,不包含SQL语句READS SQL DATA,表示子程序中,包含读数据的语句MODIFIES DATA,表示子程序中,包含写数据的语句SQL SECURITY {DEFINER | INVOKER},指明谁有权限来执行DEFINER,表示只有定义者,自己才能够执行INVOKER,表示调用者可以执行COMMENT'string',表示注释信息修改存储过程CountProc1的定义将读写权限,改为MODIFIES SQL DATA,并指明调用者可以执行查看修改后的信息目前,MySQL还不提供对已存在的存储过程的代码修改如果,一定要修改存储过程的diam,必须,先将存储过程删除之后,在重新编写代码,或者创建一个新的存储过程
  • [技术干货] Mysql exists用法总结
    简介EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。EXISTS 指定一个子查询,检测行的存在。语法:EXISTS subquery。参数 subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。结果类型为 Boolean,如果子查询包含行,则返回 TRUE。示例一张活动配置主表activity_main,通过act_code来唯一标明一场活动,活动举办地点适配表activity_area,通过act_code与主表进行关联,活动奖品表activity_sku,通过act_code与主表进行关联。活动主表CREATE TABLE `activity_main` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `act_code` varchar(255) NOT NULL COMMENT '活动代码', `act_name` varchar(255) NOT NULL COMMENT '活动名称', PRIMARY KEY (`id`), UNIQUE KEY `uniq_code` (`act_code`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='活动主表'活动在哪些网站举办的适配表CREATE TABLE `activity_area` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `act_code` varchar(255) NOT NULL COMMENT '活动代码',  `area` varchar(255) NOT NULL COMMENT '参与此活动的网站',  PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='活动适配的网站列表'活动奖品表CREATE TABLE `activity_sku` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `act_code` varchar(255) NOT NULL COMMENT '活动代码',  `sku` varchar(255) NOT NULL COMMENT '活动赠送的商品',  PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='活动赠品表'比较使用 EXISTS 和 IN 的查询这个例子比较了两个语义类似的查询。第一个查询使用 IN 而第二个查询使用 EXISTS。注意两个查询返回相同的信息。# 查询体重秤 select * from activity_main where act_code in ( select act_code from activity_sku where sku = '翎野君的体脂称' ) # 查询体重秤 select * from activity_main a where exists ( select 1 from activity_sku b where a.act_code = b.act_code and b.sku = '翎野君的体脂称' ) # 模糊查询B-BEKO英国婴儿推车 select * from activity_main where act_code in ( select act_code from activity_sku where sku like '%B-BEKO%' ) # 模糊查询B-BEKO英国婴儿推车 select * from activity_main a where exists ( select 1 from activity_sku b where a.act_code = b.act_code and b.sku like '%B-BEKO%' ) # 查询在博客园举办的活动 select * from activity_main where act_code in ( select act_code from activity_area where area = '博客园' ) # 查询在博客园举办的活动 select * from activity_main a where exists ( select 1 from activity_area b where a.act_code = b.act_code and b.area = '博客园' ) # 在博客园举办活动且活动奖品为华为手机的活动信息 select * from activity_main where act_code in ( select act_code from activity_area where area = '博客园' and act_code in ( select act_code from activity_sku where sku = '华为P30Pro' )) # 内层的exists语句只在当前where语句中生效,最终是否返回,要根据最外层的exists判断,如果是 true(真)就返回到结果集,为 false(假)丢弃。 select * from activity_main a where exists ( select 1 from activity_area b where a.act_code = b.act_code and b.area = '博客园' and exists (select 1 from activity_sku c where a.act_code = c.act_code and c.sku = '华为P30Pro') )
  • CloudIDE Python excel文件转入mysql数据库
    #导入MySQL包 import pymysql #导入读excle的包 import xlrd #打开数据库连接 conn = pymysql.connect(host="*****", port=3306, user="***", passwd="*******", db="grdb") #创建游标 cursor=conn.cursor() #打开EXCEL文件 book=xlrd.open_workbook("collection.xls") #阐明excel表的sheet名 sheet=book.sheet_by_name("Sheet1") #数据库插入语句 sql="insert into student values(%s,%s,%s)" #for循环迭代读取excel表中的每一行数据,第一行是列名,所以从第二行开始读取 for i in range(1,sheet.nrows):   #sheet.nrows表示总行数,sheet.ncols表示总列数     a=sheet.cell(i,0).value      #表中每个单元格是一个cell对象,这里返回cell对象的值 就是单元格中元素的值     b=sheet.cell(i,1).value     c=sheet.cell(i,2).value     param=(a,b,c)     cursor.execute(sql,param) conn.commit() cursor.close() conn.close()excel文件可以放在ECS上,也可以上传到Cloud IDE的工作空间上(如果满足文件大小限制)。点击资源管理器空间,右键,上传文件。执行结果:
  • CloudIDE 连接MySQL数据库
    #coding=utf-8 import pymysql try:     conn = pymysql.connect(     host = "*****",     port = 3306,     user = "wxx",     passwd = "87654321"     )     cur = conn.cursor()     cur.execute("CREATE DATABASE IF NOT EXISTS grdb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;")     cur.close()     conn.close()     print("创建数据库pythonDB成功! ") except pymysql.Error as e:     print("Mysql Error %d: %s" %(e.args[0],e.args[1]))pymysql的库直接在命令行pip install就行,其实一开始是想试试插件怎么用,可惜没找到相关的资料。正好前面开发者闯关活动的ECS资源还能用,直接用它换个Ubuntu镜像,安装mysql,设置了用户和授权。重要的事情说三遍:修改配置生效要重启mysql服务!重启mysql服务!重启mysql服务!这个小问题,绕了一大圈,查了两边ECS、couldIDE的防火墙和配置,回头发现service mysql restart重启服务居然好了!