$tj=" and (unix_timestamp(time1) < unix_timestamp(NOW()))";
徐多蔚APP开发,合肥物联网项目开发,合肥网络开发,合肥项目高端定制,企业oa开发,合肥小程序开发,合肥公众号开发,合肥网络安防 – 徐多蔚 xuduowei
联系方式[微信]:徐多蔚15309695130 感恩有您的陪伴,我们用心服务每一位客户 – 徐多蔚 xuduowei
$tj=" and (unix_timestamp(time1) < unix_timestamp(NOW()))";
刚刚尝试使用同步文件法把整个mysql的数据文件传送到另外一台服务器做双机备份。
转移完成后通过命令行形式用root账户连接上mysql查看了一下,所有数据完好,用户数据也转移过来了。
但是当我把网站数据也导入该服务器之后,所有需要访问mysql数据库的网站全部出现了无法连接的错误,症状就如同密码错误一样。
使用phpmyadmin进入mysql查看,在权限页面也可以正常看到所有的mysql账户,在mysql.user表中所有的数据也很正常。
然后我尝试了一下修改导入的账户的密码,使用了
的方法,收到了以下错误提示
Error (1133): Can’t find any matching row in the user table
经过在网上各种查询之后,找到的最简单的办法就是在mysql命令行中执行set FLUSH
这一语句即可。
PRIVILEGES;
发生这一错误的原因是在变更了mysql.user表之后,没有使用FLUSH PRIVILEGES命令来更新权限表(grant tables)
进入mysql:
mysql -uroot -p
输入密码。
选择mysql数据库:
use mysql;
增加允许远程访问的用户或者允许现有用户的远程访问。
给root授予在任意主机(%)访问任意数据库的所有权限。
update user set host='%' where user='root' and host='localhost';
退出mysql:
exit
重启数据库:
[root@localhost ~]# service mysqld restart
怎么开启?
MySQL\my.ini
中,在mysqld结构中加入:log_bin=mysqlxdw
提示:mysqlxdw是文件名,可自己任意定义。
[mysqld]
port=3306
basedir=”E:/phpStudy/MySQL/”
datadir=”E:/phpStudy/MySQL/data/”
character-set-server=utf8
default-storage-engine=MyISAM
log_bin=mysqlxdw
是否启用了日志
mysql>show variables like 'log_bin';
怎样知道当前的日志
mysql> show master status;
mysql> show binlog events;
SHOW BINLOG EVENTS IN ‘mysqlxdw.000002’;
项目调试,二进制查看
show binlog events;#显示二进制日志
PURGE MASTER LOGS TO 'mysqlxdw.000001'; #清除主日志
flush logs;#刷新日志
reset master;#复位主日志
show binlog events;
PURGE MASTER LOGS TO 'mysqlxdw.000001';
flush logs;
reset master;
1.
union :自动去除重复的数据,然后合并结果集
union all :不去除重复的数据,直接合并结果集
union为增加行;left join为增加列
1. union
union关联两张表时,增加行,两张表的字段必须相同。(增加表数据的条数)
例: 表A ( 列 a b c) 共6行数据;表B(列 a b c)共4行数据;
select * from A union select * from B : 查询结果为表C :为 a b c 3列,后共6+4=10行;
2. left join
left join关联两张表时,增加列,两张表必须有相关联的字段。(增加表数据的列数)
例: 表A ( 列 a b c ) 共4行数据;表B(列 b d e f g)共6行数据;
select * from A left join B on A.b = B.b : 查询结果为表C :为 a b c b1 d e f g 共 8列,共4行(表A的行数)
MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。
代码如下:
请教怎么从数据库随机读出15条记录?
order by rand() limit 0,15
怎么从数据库随机读出所有记录?
order by rand()
但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。
但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.
搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。
SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id ASC LIMIT 5;
但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
下面的语句采用的是JOIN,mysql的论坛上有人使用
SELECT *
FROM `table`
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
ORDER BY id LIMIT 1;
我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。
于是我把语句改写了一下。
SELECT * FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 1;
这下,效率又提高了,查询时间只有0.01秒
最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整查询语句是:
SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
ORDER BY id LIMIT 1;
SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
最后在php中对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。
1、修改localhost
更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改成”%”
mysql>use mysql;
mysql>update user set host = ‘%’ where user = ‘root’;
mysql>select host, user from user;
mysql>FLUSH PRIVILEGES;
2、指定授权
使用myuser/mypassword从任何主机连接到mysql服务器:
GRANT ALL PRIVILEGES ON *.* TO ‘myuser’@’%’ IDENTIFIED BY ‘mypassword’ WITH GRANT OPTION;
使用myuser/mypassword从ip为192.168.225.166的主机连接到mysql服务器:
GRANT ALL PRIVILEGES ON *.* TO ‘myuser’@’192.168.225.166’ IDENTIFIED BY ‘mypassword’ WITH GRANT OPTION;
3、泛授权
mysql -h localhost -u root
mysql>GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ WITH GRANT OPTION; //赋予任何主机上以root身份访问数据的权限
mysql>FLUSH PRIVILEGES;
解决Mysql无法远程连接的问题
1、Mysql的端口是否正确
通过netstat -ntlp 查看端口占用情况,一般情况下端口是3306。在用工具连接MySQl是要用到端口。例如My Admin\My Query Browser\MySQl Front等。
2、检查用户权限是否正确
mysql库的user表里有两条记录:host分别为localhost和%(为了安全,%可以换成你需要外部连接的IP)。
3、查看/etc/mysql/my.cnf中,skip-networking 是否已被注掉
需要注掉
报错:ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.51.112’ (111)
sudo gedit /etc/mysql/my.cnf
#skip-external-locking
#bind-address = 127.0.0.1
skip-name-resolve
4、查看iptables是否停掉,没关的情况下,无法连接
通过:service iptables stop临时关闭。
报错:ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.51.112’ (113)