分类目录归档:数据库

centos7mysql安装

首先查看centos7上有没有安装过mysql ,一定要卸载干净残留,不然会安装或启动失败。

yum list installed mysql*
列出后如果有就删除
  • 删除mysql
sudo yum remove mysql-community-*
rm -rf /var/lib/mysql
rm /etc/my.cnf
  • 安装yum源
wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
sudo yum instal   mysql80-community-release-el7-1.noarch.rpm
  • 查看是否安装成功

sudo yum repolist all|grep mysql

  • 配置要安装的mysql版本

sudo vim /etc/yum.repos.d/mysql-community.repo

enabled 为1表示启用,将要安装的版本的enabled改为1后保存

配置repo

  • 安装启动mysql
    sudo yum install mysql-community-server.x86_64

等待安装好后启动mysql

sudo service mysqld start      //启动mysql
sudo service mysqld status   //查看mysql状态
sudo systemctl enable mysqld //配置开机启动
  • 管理账户

mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。通过下面的方式找到root默认密码,然后登录mysql进行修改:

grep 'temporary password' /var/log/mysqld.log  //找到默认密码
mysql -uroot -p 
set password for 'root'@'localhost'=password('NEWPASSWORD'); 或者ALTER USER 'root'@'localhost' IDENTIFIED BY 'NEWPASSWORD';  // 修改密码,注意密码要复杂一些,否则会不能通过。
  • 添加远程用户(mysql 8.0以后必须要先创建用户再设置)
create user 'miroot'@'%' identified by 'Hadoop3!';
grant all privileges on *.* to 'miroot'@'%';
  • 查看并修改编码

mysql -u root -p
show variables like '%char%;
看到有的编码不是 utf8
更改配置文件
vim /etc/my.cnf
[mysqld]下面添加以下两句

character_set_server=utf8
collation-server=utf8_general_ci
[client]下面添加
default-character-set=utf8

注意修改后只会对以后创建的数据库生效。

原文:https://www.jianshu.com/p/a04bd6348fa3

参考:mysql8.0无法给用户授权或提示You are not allowed to create a user with GRANT的问题

PHP Mysql support: 是mysql 还是mysqlnd?

您正在使用其中一个备用存储库安装现代版本的php,突然间您遇到了一个令人困惑的选择。你想在php程序中支持mysql(mysqli或PDO-mysql)。你会怎么选择?

首先,您可能应该使用PDO。与mysqli相比,它只是一个更干净的数据库界面,如果你使用像Doctrine2这样的ORM,它也往往是支持的选项。

但是你可能已经发现安装PDO软件包并不能让你支持MySQL。

那么这2个套餐是什么?一旦我们将webtatic设置为回购,那么让我们看看Centos下的yum向我们展示了什么:

  • webtatic:us-east.repo.webtatic.com
    ====================================== ========
    php56w-mysql.x86_64:用于使用MySQL数据库的 PHP应用程序
    的模块php56w-mysqlnd.x86_64:用于使用MySQL数据库的PHP应用程序的模块

简而言之,mysql扩展即mysql库是引用Oracle / mysql

…通用客户端库
名为libmysql。

这是支持mysql的原始php方法。MySQL提供了一个客户端api库,并使用该c库,创建了一个php扩展,它依赖于libmysql实现着名的mysql_函数,允许php与mysql通信。

mysqlnd包(其中nd代表“本机驱动程序”)是一个项目的成果,它使mysql在php语言中最佳地工作。再次引用mysql网站:

mysqlnd库经过高度优化,可以与PHP紧密集成。MySQL客户端库无法提供相同的优化,因为它是一个通用的客户端库。

mysqlnd库使用PHP内部C基础架构无缝集成到PHP中。此外,它还使用PHP内存管理,PHP Streams(I / O抽象)和PHP字符串处理例程。例如,mysqlnd使用PHP内存管理可以通过使用只读变量(写入时复制)来节省内存,并使mysqlnd适用于PHP内存限制。

除了这些好处之外,还有一些有趣的增强功能和对插件的支持,这些插件可能是您作为开发人员或系统管理员特别感兴趣的。

一般情况下,你的代码不应该破坏,因为api在mysqlnd下应该和旧的mysql库一样。

结论

总之,您希望现在和将来使用mysqlnd。
————————————————

原文链接:https://blog.csdn.net/qq_40338373/article/details/94385423

cobal语言简介

/*************cobal语言资料****************/

COBOL
英文缩写: COBOL (Common business Oriented Language)

中文译名: COBOL语言

解 释: 一种适合于商业及数据处理的类似英语的程序设计语言。这种语言可使商业数据处理过程精确表达。

COBOL(面向商业的通用语言,又称为企业管理语言、数据处理语言等,Common Business Oriented Langauge)是最早的高级编程语言之一,是世界上第一个商用语言。

1 COBOL的历史

1959年5月,五角大楼委托格雷斯·霍波(G.Hopper)博士领导一个委员会并由Rear Admiral Grace Hopper公司主持开发,并于1961年由美国数据系统语言协会公布。正式发布于1960年4月,称为Cobol-60,现在最新的版本是Cobol-2002。

1963年,美国国家标准研究所(ANSI)进行了标准化,但是ANSI标准很少被遵循;因此,COBOL程序只是部分可移植的。

2 COBOL的重要性

经过40多年的不断修改、丰富完善和标准化,COBOL已发展为多种版本的庞大语言,在财会工作、统计报表、计划编制、情报检索、人事管理等数据管理及商业数据处理领域,都有着广泛的应用。

COBOL的重要性可以用这句话来描述:世界上70%的数据都是用COBOL语言处理的,并且90%的ATM事务处理用的都是COBOL语言。每天在线处理的COBOL事务有300亿次。500强中有492家(包括全部的100强)使用了COBOL语言,目前在COBOL方面的投资已经超过3万亿美元,,据称用COBOL书写的程序超过了1000亿行,并且以每年大约50亿行代码的速度在增长。

由于COBOL在商业领域的雄厚基础,而且COBOL主要是应用于银行、金融和会计行业等非常重要的商业数据处理领域。所以,即使对于具有相当经验的IT公司来说,重新编写COBOL语言的可靠的应用软件也是不实际或是从商业角度上并不可行的,而且还要花上很长的时间,只要大型机存在,COBOL就不会消失,即使是对电脑界产生巨大影响的“千年虫”(Y2K)也没有改变COBOL的命运。


3 COBOL的特点

COBOL是一种面向数据处理的、面向文件的、面向过程(POL)的高级编程语言,是一种功能很强而又极为冗长的语言。

COBOL适合于具有循环处理周期的环境(例如打印工资支票)以及数据操纵量相当大的环境。COBOL主要应用于商业数据处理领域,对各种类型的数据进行收集、存储、传送、分类、排序、计算及打印报表、输出图象是它的强项。

COBOL语法与英文很接近,即使不懂电脑的人也能看懂程序。

强大的文件处理功能,大量的数据通常以文件的形式存储在磁盘上。

仅提供了加、减、乘、除及乘方这五种简单的算术运算,因而不适于进行科学计算。

未来的COBOL将支持XML等Web时代的新技术。

4 COBOL的程序结构

COBOL程序由4部(DIVISION)组成:IDENTIFICATION DIVISION.(标识部)、ENVIRONMENT DIVISION.(环境部)、DATA DIVISION.(数据部)、PROCEDURE DIVISION.(过程部),而每个部又由若干节 (SECTION)组成。

/*************end cobal语言资料****************/

原文:https://blog.csdn.net/luke_hu/article/details/3788809

MYSQL避免重复插入记录的三种方法

方案一:使用ignore关键字

如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:

insert ignore into table_name(email,phone,user_id) values('test9@163.com','99999','9999'),

这样当有重复记录就会忽略,执行后返回数字0,还有个应用就是复制表,避免重复记录:

insert ignore into table(name)  select  name from table2

方案二:使用Replace

replace的语法格式为:

  1. replace into table_name(col_name, …) values(…)
  2. replace into table_name(col_name, …) select …
  3. replace into table_name set col_name=value, …

算法说明:

REPLACE的运行与INSERT很相像,但是如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除,即:

尝试把新行插入到表中 
当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时: 
从表中删除含有重复关键字值的冲突行 
再次尝试把新行插入到表中

旧记录与新记录有相同的值的判断标准就是:表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。

返回值:

REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。

受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。

示例:

eg:(phone字段为唯一索引)

  1. replace into table_name(email,phone,user_id)
  2. values(‘test569′,’99999′,’123’)

另外:在 SQL Server 中可以这样处理:

  1. if not exists (select phone from t where phone= ‘1’)
  2. insert into t(phone, update_time) values(‘1’, getdate())
  3. else
  4. update t set update_time = getdate() where phone= ‘1’

更多信息请看:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#replace

方案三:ON DUPLICATE KEY UPDATE

如‍上所写,你也可以在INSERT INTO.....后面加上 ON DUPLICATE KEY UPDATE方法来实现。

如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,

则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相

同的效果:

  1. mysql>INSERT INTO table (a,b,c) VALUES (1,2,3)
  2. ->ON DUPLICATE KEY UPDATE c=c+1;
  3. mysql>UPDATE table SET c=c+1 WHERE a=1;

如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。

注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:

mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。

您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT…UPDATE语句的INSERT部分引用列值。

换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的

col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT…UPDATE语句中有意义,其它时候

会返回NULL。

  1. mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
  2.  
  3. -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

本语句与以下两个语句作用相同:

  1. mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
  2. -> ON DUPLICATE KEY UPDATE c=3;
  3. mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
  4. -> ON DUPLICATE KEY UPDATE c=9;

当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。

示例: 这个例子是我在实际项目中用到的:是将一个表的数据导入到另外一个表中,数据的重复性就得考虑(如下)。 
唯一索引为:email

  1. INSERT INTO table_name1(title,first_name,last_name,email,phone,user_id,role_id,status,campaign_id)
  2.  
  3. SELECT ”,”,”,table_name2.email,table_name2.phone,
  4. NULL,NULL,’pending’,29
  5. FROM table_name2 WHERE table_name2.status = 1
  6. ON DUPLICATE KEY UPDATE table_name1.status = ‘pending’

语句的关键地方,都已高亮出来~

再贴一个例子:

  1. insert into class select * from class1
  2. ON DUPLICATE KEY UPDATE class.course = class1.course

其它关键:DELAYED 做为快速插入,并不是很关心失效性,提高插入性能。 
IGNORE 只关注主键对应记录是不存在,无则添加,有则忽略。

更多信息请看: http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#insert

特别说明:在MYSQL中UNIQUE 索引将会对null字段失效,也就是说(a字段上建立唯一索引):

  1. insert into test(a) values(null)
  2. insert into test(a) values(null)

是可以重复插入的(联合唯一索引也一样)。

原文:https://www.cnblogs.com/zhuyeshen/p/11643079.html

MySQL – SELECT LAST_INSERT_ID() 使用总结

目录

函数介绍

举个例子

官方文档

LAST_INSERT_ID()

 LAST_INSERT_ID(expr)


函数介绍

SELECT LAST_INSERT_ID() 即为获取最后插入的ID值

总体解释:将插入数据的主键返回到 object 对象中。
具体解释: 

  • SELECT LAST_INSERT_ID():得到刚 insert 进去记录的主键值,只适用与自增主键;
  • keyProperty:将查询到主键值设置到 parameterType 指定的对象的那个属性;
  • order:SELECT LAST_INSERT_ID() 执行顺序,相对于 insert 语句来说它的执行顺序,所以说 这个 selectKey 标签,放在前后都是可以的;
  • resultType:指定 SELECTLAST_INSERT_ID() 的结果类型;

举个例子

使用之前:

返回 的result 只有1,表示 add成功,但是从 temp 对象获取时,并没有数据。

使用之后:

不仅有result 等于1,而且 返回对象的 Id 可以获取到 为 31。

官方文档

此函数分为两种

LAST_INSERT_ID()

如果没有参数,则 LAST_INSERT_ID()返回一个 BIGINT UNSIGNED(64位)值,表示AUTO_INCREMENT由于最近执行的INSERT语句而成功为列添加 的第一个自动生成的值。LAST_INSERT_ID()如果没有成功插入行,则值 保持不变。

使用参数, LAST_INSERT_ID()返回无符号整数。

例如,在插入生成AUTO_INCREMENT值的行之后 ,您可以获得如下值:

mysql> SELECT LAST_INSERT_ID();
        -> 195

当前正在执行的语句不会影响其值 LAST_INSERT_ID()。假设您AUTO_INCREMENT使用一个语句生成一个值,然后LAST_INSERT_ID()在多行INSERT语句中引用 ,该行将行插入到具有自己AUTO_INCREMENT列的表中 。LAST_INSERT_ID()第二个陈述中的价值 将保持稳定; 它的第二行和后一行的值不受先前行插入的影响。(但是,如果将参考混合到LAST_INSERT_ID()和 ,则效果未定义。) LAST_INSERT_ID(expr)

如果前一个语句返回错误,则值为 LAST_INSERT_ID()undefined。对于事务表,如果语句由于错误而回滚,则值为 LAST_INSERT_ID()undefined。对于手动 ROLLBACK,其值LAST_INSERT_ID() 不会恢复到事务之前的值; 它仍然保持原样 ROLLBACK

在MySQL 5.7.3之前,如果正在使用复制过滤规则,则无法正确复制此函数。

在存储例程(过程或函数)或触发器LAST_INSERT_ID()的主体内,更改的值与在这些对象的主体外执行的语句的 更改方式相同。LAST_INSERT_ID()以下语句可以看出存储的例程或触发器对其值的影响 取决于例程的类型:

  • 如果存储过程执行更改值的语句,则更改的值LAST_INSERT_ID()将由过程调用之后的语句看到。
  • 对于更改值的存储函数和触发器,当函数或触发器结束时,将恢复该值,因此后续语句将不会看到更改的值。

生成的ID在每个连接的基础上在服务器中维护 。这意味着函数返回给定客户端的AUTO_INCREMENT是为该客户端影响AUTO_INCREMENT最新语句生成的第一个 值 。此值不受其他客户端的影响,即使它们生成 AUTO_INCREMENT自己的值。此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务。

LAST_INSERT_ID() 如果将AUTO_INCREMENT行的列设置为非“ 魔术 ”值(即,不是NULL和不是 的值),则不会更改 值 0

如果您将使用一个多行 INSERT的语句, LAST_INSERT_ID()返回所产生的价值第一次插入的行。这样做的原因是可以轻松地重现INSERT与其他服务器相同的 语句。

mysql> USE test;
 
mysql> CREATE TABLE t (
       id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
       name VARCHAR(10) NOT NULL
       );
 
mysql> INSERT INTO t VALUES (NULL, 'Bob');
 
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
+----+------+
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+
 
mysql> INSERT INTO t VALUES
       (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
 
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
|  2 | Mary |
|  3 | Jane |
|  4 | Lisa |
+----+------+
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+

虽然第二个INSERT 语句插入了三个新行t,但是为这些行中的第一行生成的ID是 2,并且这个值是由LAST_INSERT_ID()以下SELECT语句返回的 。

如果使用INSERT IGNORE并且忽略该行,则 LAST_INSERT_ID()保持与当前值保持不变(如果连接尚未成功INSERT,则返回0 ),对于非事务表,AUTO_INCREMENT计数器不会递增。对于InnoDB表,AUTO_INCREMENT如果innodb_autoinc_lock_mode设置为1或,则 计数器会递增 2,如以下示例所示:

mysql> USE test;
 
mysql> SELECT @@innodb_autoinc_lock_mode;
+----------------------------+
| @@innodb_autoinc_lock_mode |
+----------------------------+
|                          1 |
+----------------------------+
 
mysql> CREATE TABLE `t` (
       `id` INT(11) NOT NULL AUTO_INCREMENT,
       `val` INT(11) DEFAULT NULL,
       PRIMARY KEY (`id`),
       UNIQUE KEY `i1` (`val`)
       ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
# Insert two rows
 
mysql> INSERT INTO t (val) VALUES (1),(2);
 
# With auto_increment_offset=1, the inserted rows
# result in an AUTO_INCREMENT value of 3
 
mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `val` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `i1` (`val`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
 
# LAST_INSERT_ID() returns the first automatically generated
# value that is successfully inserted for the AUTO_INCREMENT column
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+
 
# The attempted insertion of duplicate rows fail but errors are ignored   
 
mysql> INSERT IGNORE INTO t (val) VALUES (1),(2);
Query OK, 0 rows affected (0.00 sec)
Records: 2  Duplicates: 2  Warnings: 0
 
# With innodb_autoinc_lock_mode=1, the AUTO_INCREMENT counter
# is incremented for the ignored rows
 
mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `val` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `i1` (`val`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
 
# The LAST_INSERT_ID is unchanged because the previous insert was unsuccessful
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+

 LAST_INSERT_ID(expr)

如果expr作为参数给出,则参数 LAST_INSERT_ID()的值由函数返回,并记住作为要返回的下一个值 LAST_INSERT_ID()。这可以用来模拟序列:

创建一个表来保存序列计数器并初始化它:

mysql>
CREATE TABLE  sequence  ( id  INT NOT NULL );
mysql>
INSERT INTO sequence VALUES ( 0 );

使用该表生成如下序列号:

mysql>
UPDATE sequence SET id=LAST_INSERT_ID(+1);
mysql>
SELECT LAST_INSERT_ID();

UPDATE语句递增序列计数器并使下一次调用LAST_INSERT_ID()返回更新的值。该 SELECT语句检索该值。

您可以在不调用的情况下生成序列 LAST_INSERT_ID(),但以这种方式使用函数的实用程序是ID值在服务器中作为最后自动生成的值进行维护。它是多用户安全的,因为多个客户端可以发出UPDATE语句并使用SELECT语句(或 mysql_insert_id())获取自己的序列值 ,而不会影响或受到生成其自己的序列值的其他客户端的影响。

请注意,mysql_insert_id()只有更新后INSERT和 UPDATE语句,所以你不能使用C API函数来检索值 执行像其他SQL语句后 或 。 LAST_INSERT_ID(expr)SELECTSET

参考文档:

MySQL :: MySQL 5.7参考手册:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id

原文:https://blog.csdn.net/soinice/article/details/88845898

mysql查询当天,前一天,一周,一个月

当天

select * from 表名 where to_days(时间字段名) = to_days(now());

昨天

SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1

7天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)

近30天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)

本月

SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )

上一月

SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1
#查询本季度数据
select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(now());

#查询上季度数据
select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(DATE_SUB(now(),interval 1 QUARTER));

#查询本年数据
select * from `ht_invoice_information` where YEAR(create_date)=YEAR(NOW());

#查询上年数据
select * from `ht_invoice_information` where year(create_date)=year(date_sub(now(),interval 1 year));
#查询当前这周的数据 
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now());

#查询上周的数据
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now())-1;

#查询当前月份的数据
select name,submittime from enterprise   where date_format(submittime,'%Y-%m')=date_format(now(),'%Y-%m')

#查询距离当前现在6个月的数据
select name,submittime from enterprise where submittime between date_sub(now(),interval 6 month) and now();
#查询上个月的数据
select name,submittime from enterprise   where date_format(submittime,'%Y-%m')=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m')

select * from ` user ` where DATE_FORMAT(pudate, ' %Y%m ' ) = DATE_FORMAT(CURDATE(), ' %Y%m ' ) ;

select * from user where WEEKOFYEAR(FROM_UNIXTIME(pudate,'%y-%m-%d')) = WEEKOFYEAR(now())

select * from user where MONTH (FROM_UNIXTIME(pudate, ' %y-%m-%d ' )) = MONTH (now())

select * from [ user ] where YEAR (FROM_UNIXTIME(pudate, ' %y-%m-%d ' )) = YEAR (now()) and MONTH (FROM_UNIXTIME(pudate, ' %y-%m-%d ' )) = MONTH (now())

select * from [ user ] where pudate between 上月最后一天 and 下月第一天

MySQL事件(定时任务)

1、事件概述

在MySQL 5.1中新增了一个特色功能事件调度器(Event Scheduler),简称事件。它可以作为定时任务调度器,取代部分原来只能用操作系统的计划任务才能执行的工作。另外,更值得一提的是,MySQL的事件可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下是非常实用的。

事件调度器是定时触发执行的,从这个角度上看也可以称作是“临时触发器”。但是它与触发器又有所区别,触发器只针对某个表产生的事件执行一些语句,而事件调度器则是在某一段(间隔)时间执行一些语句。

1.1 查看事件调度器是否开启

事件由一个特定的线程来管理。启用事件调度器后,拥有SUPER权限的账户执行SHOW PROCESSLIST就可以看到这个线程了。

示例:查看事件是否开启。

SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;

1.2 开启或关闭事件调度器

通过设定全局变量event_scheduler的值即可动态的控制事件调度器是否启用。开启MySQL的事件调度器,可以通过下面两种方式实现。

1.2.1 通过设置全局参数

使用SET GLOBAL命令可以开启或关闭事件。将event_scheduler参数的值设置为ON,则开启事件;如果设置为OFF,则关闭事件。

示例:使用SET GLOBAL命令可以开启或关闭事件。

-- 开启事件调度器SET 
GLOBAL event_scheduler = ON; 

-- 关闭事件调度器
SET GLOBAL event_scheduler = OFF; 

-- 查看事件调度器状态
SHOW VARIABLES LIKE 'event_scheduler';

注意:如果想要始终开启事件,那么在使用SET GLOBAL开启事件后,还需要在my.ini(Windows系统)/my.cnf(Linux系统)中添加event_scheduler=on。因为如果没有添加,MySQL重启事件后又会回到原来的状态。

1.2.2 通过更改配置文件

在MySQL的配置文件my.ini(Windows系统)/my.cnf(Linux系统)中,找对[mysqld],然后在下面添加以下代码开启事件。

# 事件调度器启动状态
event_scheduler = on

在配置文件中添加代码并保存文件后,还需要重新启动MySQL服务器才能生效。通过该方法开启事件,重启MySQL服务器后,不恢复为系统默认的状态。

2、创建事件

在MySQL 5.1以上版本中,可以通过CREATE EVENT语句来创建事件。

CREATE
	[DEFINER={user | CURRENT_USER}]
	EVENT [IF NOT EXISTS] event_name
	ON SCHEDULE schedule
	[ON COMPLETION [NOT] PRESERVE]
	[ENABLE | DISABLE | DISABLE ON SLAVE]
	[COMMENT 'comment']
	DO event_body;

CREATE EVENT语句的子句:

子句说明
DEFINER可选,用于定义事件执行时检查权限的用户
IF NOT EXISTS可选项,用于判断要创建的事件是否存在
EVENT event_name必选,用于指定事件名,event_name的最大长度为64个字符,如果为指定event_name,则默认为当前的MySQL用户名(不区分大小写)
ON SCHEDULE schedule必选,用于定义执行的时间和时间间隔
ON COMPLETION [NOT] PRESERVE可选,用于定义事件是否循环执行,即是一次执行还是永久执行,默认为一次执行,即 NOT PRESERVE
ENABLE | DISABLE | DISABLE ON SLAVE可选项,用于指定事件的一种属性。其中,关键字ENABLE表示该事件是活动的,也就是调度器检查事件是否必选调用;关键字DISABLE表示该事件是关闭的,也就是事件的声明存储到目录中,但是调度器不会检查它是否应该调用;关键字DISABLE ON SLAVE表示事件在从机中是关闭的。如果不指定这三个选择中的任意一个,则在一个事件创建之后,它立即变为活动的。
COMMENT ‘comment’可选,用于定义事件的注释
DO event_body必选,用于指定事件启动时所要执行的代码。可以是任何有效的SQL语句、存储过程或者一个计划执行的事件。如果包含多条语句,可以使用BEGIN…END复合结构

在ON SCHEDULE子句中,参数schedule的值为一个AS子句,用于指定事件在某个时刻发生,其语法格式如下:

AT timestamp [+ INTERVAL interval] ...
  | EVERY interval
    [STARTS timestamp [+ INTERVAL interval] ...]
    [ENDS timestamp [+ INTERVAL interval] ...]

参数说明:

(1)timestamp:表示一个具体的时间点,后面加上一个时间间隔,表示在这个时间间隔后事件发生。

(2)EVERY子句:用于表示事件在指定时间区间内每隔多长时间发生一次,其中 SELECT子句用于指定开始时间;ENDS子句用于指定结束时间。

(3)interval:表示一个从现在开始的时间,其值由一个数值和单位构成。例如,使用“4 WEEK”表示4周;使用“‘1:10’ HOUR_MINUTE”表示1小时10分钟。间隔的距离用DATE_ADD()函数来支配。

interval参数值的语法格式如下:

quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

一些常用的时间间隔设置:

(1)每隔5秒钟执行

ON SCHEDULE EVERY 5 SECOND

(2)每隔1分钟执行

ON SCHEDULE EVERY 1 MINUTE

(3)每天凌晨1点执行

ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR)

(4)每个月的第一天凌晨1点执行

ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR)

(5)每 3 个月,从现在起一周后开始

ON SCHEDULE EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK

(6)每十二个小时,从现在起三十分钟后开始,并于现在起四个星期后结束

ON SCHEDULE EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK

示例1:创建名称为event_user的事件,用于每隔5秒钟向数据表tb_user(用户信息表)中插入一条数据。

(1)首先创建tb_user(用户信息表)。

-- 创建用户信息表CREATE TABLE IF NOT EXISTS tb_user
(
	id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
	name VARCHAR(30) NOT NULL COMMENT '用户姓名',
	create_time TIMESTAMP COMMENT '创建时间'
) COMMENT = '用户信息表';

(2)创建事件。

-- 创建事件
CREATE EVENT IF NOT EXISTS event_user
ON SCHEDULE EVERY 5 SECONDON COMPLETI
ON PRESERVE
COMMENT '新增用户信息定时任务'
DO INSERT INTO tb_user(name,create_time) VALUES('pan_junbiao的博客',NOW());

执行结果:

示例2:创建一个事件,实现每个月的第一天凌晨1点统计一次已经注册的会员人数,并插入到统计表中。

(1)创建名称为p_total的存储过程,用于统计已经注册的会员人数,并插入到统计表tb_total中。

CREATE PROCEDURE p_total()
BEGIN
	DECLARE n_total INT default 0;
	SELECT COUNT(*) INTO n_total FROM db_database11.tb_user;
	INSERT INTO tb_total (userNumber,createtime) VALUES(n_total,NOW());
END;

(2)创建名称为e_autoTotal的事件,用于在每个月的第一天凌晨1点调用存储过程。

CREATE EVENT IF NOT EXISTS e_autoTotal
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR)
ON COMPLETION PRESERVE ENABLE
DO CALL p_total();

3、查询事件

在MySQL中可以通过查询information_schema.events表,查看已创建的事件。其语句如下:

SELECT * FROM information_schema.events; 

4、修改事件

在MySQL 5.1及以后版本中,事件被创建之后,还可以使用ALTER EVENT语句修改其定义和相关属性。其语法如下:

ALTER
	[DEFINER={user | CURRENT_USER}]
	EVENT [IF NOT EXISTS] event_name
	ON SCHEDULE schedule
	[ON COMPLETION [NOT] PRESERVE]
	[ENABLE | DISABLE | DISABLE ON SLAVE]
	[COMMENT 'comment']
	DO event_body;

ALTER EVENT语句与CREATE EVENT语句基本相同。另外ALTER EVENT语句还有一个用法就是让一个事件关闭或再次活动。

5、启动与关闭事件

另外ALTER EVENT语句还有一个用法就是让一个事件关闭或再次活动。

示例:启动名称为event_user的事件。

ALTER EVENT event_user ENABLE;

示例:关闭名称为event_user的事件。

ALTER EVENT event_user DISABLE;

6、删除事件

在MySQL 5.1及以后版本中,删除已经创建的事件可以使用DROP EVENT语句来实现。

示例:删除名称为event_user的事件。

DROP EVENT IF EXISTS event_user;

原文:https://blog.csdn.net/pan_junbiao/article/details/86489237

mysql 使用sql语句查询数据库所有表注释以及表字段的注释

mysql使用sql语句查询数据库所有表注释已经表字段注释

场景:

1. 要查询数据库 “my_table_name” 下所有表名以及表注释

/* 查询数据库 ‘my_table_name’ 所有表注释 */
SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.TABLES WHERE table_schema='my_table_name';

2. 要查询表字段的注释

/* 查询数据库 ‘mammothcode’ 下表 ‘my_table_name1’ 所有字段注释 */
SELECT COLUMN_NAME,column_comment,COLUMN_TYPE,COLUMN_DEFAULT FROM INFORMATION_SCHEMA.Columns WHERE table_name='my_table_name1' AND table_schema='mammothcode'

3. 一次性查询数据库 “mammothcode” 下表注释以及对应表字段注释

SELECT t.TABLE_NAME,t.TABLE_COMMENT,c.COLUMN_NAME,c.COLUMN_TYPE,c.COLUMN_COMMENT FROM information_schema.TABLES t,INFORMATION_SCHEMA.Columns c WHERE c.TABLE_NAME=t.TABLE_NAME AND t.TABLE_SCHEMA='mammothcode'

mysql:Windows修改MySQL数据库密码(修改或忘记密码)

今天练习远程访问数据库时,为了方便访问,就想着把数据库密码改为统一的,以后我们也会经常遇到MySQL需要修改密码的情况,比如密码太简单、忘记密码等等。在这里我就借鉴其他人的方法总结几种修改MySQL密码的方法。

我就以实际操作修改root密码为例,操作系统为windows
这里我们需要注意的是,修改MySQL是需要MySQL中的root权限,一般用户是无法更改的,除非请求管理员。

修改密码的三种简单方法

第一种​用SET PASSWORD命令

1.打开cmd进入MySQL的bin目录;(如我的路径是F:\MySQL\mysql-5.7.24-winx64\bin)

2.通过输入命令 mysql -u root -p 指定root用户登录MySQL,输入后回车会提示输入密码,输入我们原来的密码然后回车。

3.修改MySQL的root用户密码,格式:mysql> set password for 用户名@localhost = password(‘新密码’);
例如(上面例子将用户root的密码更改为root):mysql> set password for root@localhost = password(‘root’);

4.退出mysql重新登录,输入新密码root登录就可以了;
在这里插入图片描述

第二种 用mysqladmin修改密码

1.打开cmd进入MySQL的bin目录;(如我的路径是F:\MySQL\mysql-5.7.24-winx64\bin)

2.修改MySQL的root用户密码格式:mysqladmin -u用户名 -p旧密码; password 新密码
例如(第一种方法中我将密码改成了root,这里再改回123):
mysqladmin -uroot -proot password 123(这里一定要注意-uroot和 -proot是整体,不要写成-u root -p root,我亲自验证过他们直接加-u和root间可以加空格,但是会有警告出现,所以就不要加空格了)

重新登录,输入新密码123就ok了;
在这里插入图片描述

第三种用UPDATE直接编辑user表

首先声明,这种方法我测试了半个小时也没有成功,但是网上查询很多人都成功了,感兴趣的话可以尝试一下。下面是步骤
首先还是通过cmd 登录MySQL
连接权限数据库: use mysql;
改密码:update user set password=password(“123”) where user=“root”;(别忘了最后加分号) 。
刷新权限(必须步骤):flush privileges;

忘记root密码情况

1.关闭正在运行的MySQL服务。打开cmd进入MySQL的bin目录;

2.输入mysqld –skip-grant-tables 回车。(–skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。)

3.再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),输入mysql回车,如果成功,将出现MySQL提示符 >。
连接权限数据库: use mysql; 。
4.改密码:update user set password=password(“root”) where user=“root”;(别忘了最后加分号) 。
刷新权限(必须步骤):flush privileges; 。
退出 quit;
重启mysql服务,使用用户名root和刚才设置的新密码root登录就ok了;

在这里插入图片描述
对mysql钻研了几个小时,发现输入命令还是比较简单的,只要记住一些语句就可以在DOS窗口随意操作我们的数据库了。

原文:https://blog.csdn.net/m0_37482190/article/details/86635339

Mysql受到爆破攻击导致内存不足挂掉

PHP游戏挂掉,游戏日志里全是mysql的报错,查看/var/log/mysql/mysqld.log,发现受到爆破攻击

截图记录

使用sytemctl restart mysql始终报错,最后在mysqld.log中发现报错:

是系统空间不足导致的,清理系统空间,见CentOS清理/dev/vda1系统盘

这次删掉的是16G大小的/usr/local/php/var/log/php-fpm.log,可怕

随后在控制台关掉了以前没注意到的端口访问问题,现3306端口只能指定IP访问,可避免爆破攻击。

参考:惊魂未定,回忆mysql挂掉运维历程