ORACLE发给ACE的邮件中提到MySQL 5.7.8新功能,有几个地方比较感兴趣:
1、新增super_read_only选项防止read_only开启后,仍有SUPER权限的用户修改数据(这时只有复制线程能写数据),避免主从数据不一致等问题;
2、新增disabled_storage_engines选项,比如说可用来强制禁用MyISAM引擎,避免有人再意外创建MyISAM表;
3、即将发布mysqlpump客户端工具以取代mysqldump,这是全新的并行备份工具。测试备份6个一样大小的表,默认并发2线程时相比mysqldump提速2.1倍,并发6线程时则提速5倍,并发的威力还是很猛的,当然了,实际线上使用时还要考虑服务器的I/O压力能否承载得住。
总的来说,5.7版本是非常值得期待的
1、新增super_read_only选项防止read_only开启后,仍有SUPER权限的用户修改数据(这时只有复制线程能写数据),避免主从数据不一致等问题;
2、新增disabled_storage_engines选项,比如说可用来强制禁用MyISAM引擎,避免有人再意外创建MyISAM表;
3、即将发布mysqlpump客户端工具以取代mysqldump,这是全新的并行备份工具。测试备份6个一样大小的表,默认并发2线程时相比mysqldump提速2.1倍,并发6线程时则提速5倍,并发的威力还是很猛的,当然了,实际线上使用时还要考虑服务器的I/O压力能否承载得住。
总的来说,5.7版本是非常值得期待的
1.在http://www.percona.com/downloads/XtraBackup/LATEST/ 下载对应平台的XtraBackup,这里使用的是 http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.0/binary/Linux/x86_64/percona-xtrabackup-2.0.0.tar.gz
2.解压tar -zvxf percona-xtrabackup-2.0.0.tar.gz -C /usr/local/
3.因为MySQL我安装的是Percona-Server-5.5.21,而且安装目录为:/usr/local/Percona-Server-5.5.21-rel25.0-227.Linux.x86_64/,注:同样可以用于其他MySQL版本
Shell代码 收藏代码
cd /usr/local/percona-xtrabackup-2.0.0/bin
cp * /usr/local/Percona-Server-5.5.21-rel25.0-227.Linux.x86_64/bin/
因为系统Path里面已经加入
Shell代码 收藏代码
export PATH=$JAVA_HOME/bin:/usr/local/Percona-Server-5.5.21-rel25.0-227.Linux.x86_64/bin:$PATH
4.我的mysql的配置文件是/etc/my.cnf,如果不指定,XtraBackup默认使用此文件识别mysql安装目录,数据文件目录等信息
5.全量备份:innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/,我使用/data/backup/mysql/作为mysql备份文件存放目录
Shell代码 收藏代码
innobackupex --user=YOUS --password=YOUS /data/backup/mysql
看到类似输出说明备份成功,如出错,根据提示解决
Shell代码 收藏代码
innobackupex: Backup created in directory '/data/backup/mysql/2012-05-28_19-01-32'
innobackupex: MySQL binlog position: filename 'mysql-bin.000063', position 44718229367
120528 19:07:53 innobackupex: completed OK!
可以在/data/backup/mysql/2012-05-28_19-01-32看到备份的文件
此时,cat xtrabackup_checkpoints会看到
Shell代码 收藏代码
backup_type = full-backuped
from_lsn = 0
to_lsn = 44718229367
last_lsn = 44718229367
6.全量Preparing:innobackupex --apply-log /path/to/BACKUP-DIR
Shell代码 收藏代码
innobackupex --user=YOUS --password=YOUS --apply-log /data/backup/mysql/2012-05-28_19-01-32/
可以看到如下生成文件:
Shell代码 收藏代码
-rw-r--r--. 1 root root 13 May 28 19:07 xtrabackup_binary
-rw-r--r--. 1 root root 26 May 29 15:07 xtrabackup_binlog_info
-rw-r--r--. 1 root root 43 May 29 15:07 xtrabackup_binlog_pos_innodb
-rw-r-----. 1 root root 85 May 29 15:07 xtrabackup_checkpoints
-rw-r-----. 1 root root 2097152 May 29 14:03 xtrabackup_logfile
cat xtrabackup_checkpoints,可以看出是全量备份并且做了prepare的
Shell代码 收藏代码
backup_type = full-prepared
from_lsn = 0
to_lsn = 49556823920
last_lsn = 49556823920
7.增量备份的前提是必须已经做过全量备份。
增量备份:innobackupex --incremental /path/to/BACKUP-DIR/--incremental-basedir=BASEDIR,当有了INCREMENTAL-DIR-1之后,下一次增量备份的需要基于INCREMENTAL-DIR-1,变成innobackupex --incremental /path/to/BACKUP-DIR/ --incremental-basedir=INCREMENTAL-DIR-1
全量备份的目录是:/data/backup/mysql/2012-05-28_19-01-32
Shell代码 收藏代码
innobackupex --incremental /data/backup/mysql --incremental-basedir=/data/backup/mysql/2012-05-28_19-01-32/ --user=YOUS --password=YOUS
增量备份成功会生成目录/data/backup/mysql/2012-05-29_14-25-03
cat xtrabackup_checkpoints
Shell代码 收藏代码
backup_type = incremental
from_lsn = 44718229367
to_lsn = 49556823920
last_lsn = 49556823920
8.增量Preparing,对每一个增量备份目录:
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
Shell代码 收藏代码
innobackupex --apply-log --redo-only /data/backup/mysql/2012-05-28_19-01-32/ --incremental-dir=/data/backup/mysql/2012-05-29_14-25-03 --user=YOUS--password=YOUS
看到如下输出:
Shell代码 收藏代码
120529 14:29:43 InnoDB: Shutdown completed; log sequence number 49556823920
120529 14:29:43 innobackupex: completed OK!
cd BASE-DIR,cat xtrabackup_checkpoints
Shell代码 收藏代码
backup_type = full-prepared
from_lsn = 0
to_lsn = 49556823920
last_lsn = 49556823920
当把所有的增量备份都执行Preparing后,还可以全量备份和全部的增量备份做一次Preparing,
innobackupex --apply-log BASE-DIR
9.恢复数据:innobackupex --copy-back BASE-DIR
参考:http://www.percona.com/doc/percona-xtrabackup/innobackupex/innobackupex_script.html
来自:http://willvvv.iteye.com/blog/1544043
2.解压tar -zvxf percona-xtrabackup-2.0.0.tar.gz -C /usr/local/
3.因为MySQL我安装的是Percona-Server-5.5.21,而且安装目录为:/usr/local/Percona-Server-5.5.21-rel25.0-227.Linux.x86_64/,注:同样可以用于其他MySQL版本
Shell代码 收藏代码
cd /usr/local/percona-xtrabackup-2.0.0/bin
cp * /usr/local/Percona-Server-5.5.21-rel25.0-227.Linux.x86_64/bin/
因为系统Path里面已经加入
Shell代码 收藏代码
export PATH=$JAVA_HOME/bin:/usr/local/Percona-Server-5.5.21-rel25.0-227.Linux.x86_64/bin:$PATH
4.我的mysql的配置文件是/etc/my.cnf,如果不指定,XtraBackup默认使用此文件识别mysql安装目录,数据文件目录等信息
5.全量备份:innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/,我使用/data/backup/mysql/作为mysql备份文件存放目录
Shell代码 收藏代码
innobackupex --user=YOUS --password=YOUS /data/backup/mysql
看到类似输出说明备份成功,如出错,根据提示解决
Shell代码 收藏代码
innobackupex: Backup created in directory '/data/backup/mysql/2012-05-28_19-01-32'
innobackupex: MySQL binlog position: filename 'mysql-bin.000063', position 44718229367
120528 19:07:53 innobackupex: completed OK!
可以在/data/backup/mysql/2012-05-28_19-01-32看到备份的文件
此时,cat xtrabackup_checkpoints会看到
Shell代码 收藏代码
backup_type = full-backuped
from_lsn = 0
to_lsn = 44718229367
last_lsn = 44718229367
6.全量Preparing:innobackupex --apply-log /path/to/BACKUP-DIR
Shell代码 收藏代码
innobackupex --user=YOUS --password=YOUS --apply-log /data/backup/mysql/2012-05-28_19-01-32/
可以看到如下生成文件:
Shell代码 收藏代码
-rw-r--r--. 1 root root 13 May 28 19:07 xtrabackup_binary
-rw-r--r--. 1 root root 26 May 29 15:07 xtrabackup_binlog_info
-rw-r--r--. 1 root root 43 May 29 15:07 xtrabackup_binlog_pos_innodb
-rw-r-----. 1 root root 85 May 29 15:07 xtrabackup_checkpoints
-rw-r-----. 1 root root 2097152 May 29 14:03 xtrabackup_logfile
cat xtrabackup_checkpoints,可以看出是全量备份并且做了prepare的
Shell代码 收藏代码
backup_type = full-prepared
from_lsn = 0
to_lsn = 49556823920
last_lsn = 49556823920
7.增量备份的前提是必须已经做过全量备份。
增量备份:innobackupex --incremental /path/to/BACKUP-DIR/--incremental-basedir=BASEDIR,当有了INCREMENTAL-DIR-1之后,下一次增量备份的需要基于INCREMENTAL-DIR-1,变成innobackupex --incremental /path/to/BACKUP-DIR/ --incremental-basedir=INCREMENTAL-DIR-1
全量备份的目录是:/data/backup/mysql/2012-05-28_19-01-32
Shell代码 收藏代码
innobackupex --incremental /data/backup/mysql --incremental-basedir=/data/backup/mysql/2012-05-28_19-01-32/ --user=YOUS --password=YOUS
增量备份成功会生成目录/data/backup/mysql/2012-05-29_14-25-03
cat xtrabackup_checkpoints
Shell代码 收藏代码
backup_type = incremental
from_lsn = 44718229367
to_lsn = 49556823920
last_lsn = 49556823920
8.增量Preparing,对每一个增量备份目录:
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
Shell代码 收藏代码
innobackupex --apply-log --redo-only /data/backup/mysql/2012-05-28_19-01-32/ --incremental-dir=/data/backup/mysql/2012-05-29_14-25-03 --user=YOUS--password=YOUS
看到如下输出:
Shell代码 收藏代码
120529 14:29:43 InnoDB: Shutdown completed; log sequence number 49556823920
120529 14:29:43 innobackupex: completed OK!
cd BASE-DIR,cat xtrabackup_checkpoints
Shell代码 收藏代码
backup_type = full-prepared
from_lsn = 0
to_lsn = 49556823920
last_lsn = 49556823920
当把所有的增量备份都执行Preparing后,还可以全量备份和全部的增量备份做一次Preparing,
innobackupex --apply-log BASE-DIR
9.恢复数据:innobackupex --copy-back BASE-DIR
参考:http://www.percona.com/doc/percona-xtrabackup/innobackupex/innobackupex_script.html
来自:http://willvvv.iteye.com/blog/1544043
mysqlbinlog的问题求助:通过mysqlbinlog 导出来的日志文件,mysql如论如何都认不到File is not a binary log file
mysqlbinlog mysql-bin.000067 >xxx.sql
mysqlbinlog xxx.sql 这里就报错了
ERROR: File is not a binary log file
mysqlbinlog --start-position=433760210 --stop-position=433761222 mysql-bin.000067 >xx.sql
mysqlbinlog xx.sql 也是报一样错
ERROR: File is not a binary log file
这个?
先确定 /home/mysql/bin/mysqlbinlog 是你当前运行的mysqld对应的版本,另外,可能是该binlog已经损坏了
Egg:
/usr/local/mysql/bin/mysqlbinlog --version
/usr/local/mysql/bin/mysqlbinlog Ver 3.4 for Linux at x86_64
摘自:http://zhidao.baidu.com/link?url=GB02-myeLDIVy8Y5koL8U1LYUThvflxxdhzP3NHU1FknlfF5JSYpkLmJb4Lxf7K5rIVFHGeinykj74rTsHlZVROVGkRorLxCBnjqVOwDxiq
mysqlbinlog mysql-bin.000067 >xxx.sql
mysqlbinlog xxx.sql 这里就报错了
ERROR: File is not a binary log file
mysqlbinlog --start-position=433760210 --stop-position=433761222 mysql-bin.000067 >xx.sql
mysqlbinlog xx.sql 也是报一样错
ERROR: File is not a binary log file
这个?
先确定 /home/mysql/bin/mysqlbinlog 是你当前运行的mysqld对应的版本,另外,可能是该binlog已经损坏了
Egg:
/usr/local/mysql/bin/mysqlbinlog --version
/usr/local/mysql/bin/mysqlbinlog Ver 3.4 for Linux at x86_64
摘自:http://zhidao.baidu.com/link?url=GB02-myeLDIVy8Y5koL8U1LYUThvflxxdhzP3NHU1FknlfF5JSYpkLmJb4Lxf7K5rIVFHGeinykj74rTsHlZVROVGkRorLxCBnjqVOwDxiq
经常给别人安装lnmp但是安装时间过长MYSQL密码容易忘记,在这里给大家介绍下如何更改密码。
1.停掉LNMP
/root/lnmp stop
2.修改MYSQL配置文件
vim /etc/my.cnf
光标到[mysqld]后面按一次“i”进入插入模式,然后按enter回车输入“skip-grant-tables”,在按ESC输入“:wq”回车即可保存。
3.启动LNMP
/root/lnmp start
4.修改密码
mysql
update user set Password = password ( '123456' ) where user = 'root' ;
exit
其中123456就是你的新密码,别忘记最后的分号要不然是不会更新好的。
MySql 5.7.19 忘记密码:
update mysql.user set authentication_string=PASSWORD('你的密码') where User='root';
flush privileges;
5.将刚才配置过的my.cnf修改回来,删除掉skip-grant-tables即可,这样安全。
6.重启LNMP。
/root/lnmp restart
来自:http://jinzhe.net/post/42.html
Windows是my.ini,Linux是my.cnf:
1.停掉LNMP
/root/lnmp stop
2.修改MYSQL配置文件
vim /etc/my.cnf
光标到[mysqld]后面按一次“i”进入插入模式,然后按enter回车输入“skip-grant-tables”,在按ESC输入“:wq”回车即可保存。
3.启动LNMP
/root/lnmp start
4.修改密码
mysql
update user set Password = password ( '123456' ) where user = 'root' ;
exit
其中123456就是你的新密码,别忘记最后的分号要不然是不会更新好的。
MySql 5.7.19 忘记密码:
update mysql.user set authentication_string=PASSWORD('你的密码') where User='root';
flush privileges;
5.将刚才配置过的my.cnf修改回来,删除掉skip-grant-tables即可,这样安全。
6.重启LNMP。
/root/lnmp restart
来自:http://jinzhe.net/post/42.html
Windows是my.ini,Linux是my.cnf:
背景:# Query_time: 3.124972 Lock_time: 0.000162 Rows_sent: 0 Rows_examined: 1
SET timestamp=1413791419;
UPDATE LOW_PRIORITY `boblog_blogs` SET `views`=`views`+1 WHERE `blogid`='4588';
阅读全文
SET timestamp=1413791419;
UPDATE LOW_PRIORITY `boblog_blogs` SET `views`=`views`+1 WHERE `blogid`='4588';
阅读全文
在mysql数据库的err文件中看到如下信息:
Plugin 'FEDERATED' is disabled
InnoDB: The InnoDB memory heap is disabled
解决方法:vi /etc/my.cnf
tmpdir = /tmp
innodb_use_sys_malloc =0
重启问题解决?
这个参数是不是新的过时了呢?
InnoDB: Warning: Setting innodb_use_sys_malloc to FALSE is DEPRECATED. This option may be removed in future releases, together with the InnoDB's internal memory allocator.
InnoDB:警告:设置innodb_use_sys_malloc假是过时的。此选项可能会在未来的版本中删除,连同InnoDB的内存分配器。
[Note] Plugin 'FEDERATED' is disabled.
这个不用理会的,没事。
__________________________________________
在网上找到解决方案:
1、在MY.INI文件中的 [mysqld] 中增加一行tmpdir="D:/MySQL/data/"修改后,还是启动不了或者能启动但关机后又出现同样问题,接着我做了第二步,重启正常。
2、删除DATA目录下除数据库文件夹外的其他文件,重启mysql,问题解决.
上面办法我按做了但是不行,自己摸索出一个解决办法与上面差不多
第一步:只要删除MySQL目录下的ib_logfile0和ib_logfile1两个文件.
第二步:找出了无法启动的原因,MySQL在安装的时候不会自动初始tmpdir,临时文件目录,所以要在配置文件my.ini中添加tmpdir路径.
最后在my.ini中添加:
[mysqld]
#自己指定的临时文件目录
tmpdir="E:/Program Files/MySQL/MySQL Server 5.1/Temp/" //phpfensi.com
来自:http://www.phpfensi.com/mysql/20140927/6253.html
[root@jackxiang mysql]# ls ib_logfile
ib_logfile0 ib_logfile1 ib_logfile2
Plugin 'FEDERATED' is disabled
InnoDB: The InnoDB memory heap is disabled
解决方法:vi /etc/my.cnf
tmpdir = /tmp
innodb_use_sys_malloc =0
重启问题解决?
这个参数是不是新的过时了呢?
InnoDB: Warning: Setting innodb_use_sys_malloc to FALSE is DEPRECATED. This option may be removed in future releases, together with the InnoDB's internal memory allocator.
InnoDB:警告:设置innodb_use_sys_malloc假是过时的。此选项可能会在未来的版本中删除,连同InnoDB的内存分配器。
[Note] Plugin 'FEDERATED' is disabled.
这个不用理会的,没事。
__________________________________________
在网上找到解决方案:
1、在MY.INI文件中的 [mysqld] 中增加一行tmpdir="D:/MySQL/data/"修改后,还是启动不了或者能启动但关机后又出现同样问题,接着我做了第二步,重启正常。
2、删除DATA目录下除数据库文件夹外的其他文件,重启mysql,问题解决.
上面办法我按做了但是不行,自己摸索出一个解决办法与上面差不多
第一步:只要删除MySQL目录下的ib_logfile0和ib_logfile1两个文件.
第二步:找出了无法启动的原因,MySQL在安装的时候不会自动初始tmpdir,临时文件目录,所以要在配置文件my.ini中添加tmpdir路径.
最后在my.ini中添加:
[mysqld]
#自己指定的临时文件目录
tmpdir="E:/Program Files/MySQL/MySQL Server 5.1/Temp/" //phpfensi.com
来自:http://www.phpfensi.com/mysql/20140927/6253.html
[root@jackxiang mysql]# ls ib_logfile
ib_logfile0 ib_logfile1 ib_logfile2
查看mysql启动日志:
2014-10-01 11:08:45 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
这是数据库升级过程中,timestamp在5.6以前的数据库中默认not null,如果没有显示声明timestamp的默认值,那么该列用全0的”0000-00-00 00:00:00″作为默认值
加上还是会报这个问题,听说有一个坑,于是查了一下,这个Url有点用:http://cuelog.com/archives/4.html
如果初始化时出现
1 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
在mysql的安装根目录下生成的my.cnf中加入:
2 explicit_defaults_for_timestamp = true
还是报错,按mysql提示的执行下面的mysql启动命令:
按mysql的说明,接下来是执行:
3 ./bin/mysqld_safe --user=mysql --explicit_defaults_for_timestamp=1 &
——————————————————————————————————————————————
来自:
http://www.kankanews.com/ICkengine/archives/110105.shtml
http://www.williamsang.com/archives/818.html
2014-10-01 11:08:45 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
这是数据库升级过程中,timestamp在5.6以前的数据库中默认not null,如果没有显示声明timestamp的默认值,那么该列用全0的”0000-00-00 00:00:00″作为默认值
加上还是会报这个问题,听说有一个坑,于是查了一下,这个Url有点用:http://cuelog.com/archives/4.html
如果初始化时出现
1 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
在mysql的安装根目录下生成的my.cnf中加入:
2 explicit_defaults_for_timestamp = true
还是报错,按mysql提示的执行下面的mysql启动命令:
按mysql的说明,接下来是执行:
3 ./bin/mysqld_safe --user=mysql --explicit_defaults_for_timestamp=1 &
——————————————————————————————————————————————
来自:
http://www.kankanews.com/ICkengine/archives/110105.shtml
http://www.williamsang.com/archives/818.html
背景:skip-name-resolve 参数的目的是不再进行反解析(ip不反解成域名),这样可以加快数据库的反应时间。修改配置文件添加并需要重启:[mysqld] skip-name-resolve添加后发现错误日志有警告信息:
[root@jackxiang mysql]# vi my.cnf
skip-name-resolve
# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,
# 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求
实践如下:
重启mysql,发现日志还有:
1)按提示作下查询,果然有一个空账户和root帐户的Host是jackxiang:
select * from user where Host="jackxiang"\G;
mysql> select Host,User,Password from user where Host="jackxiang";
+-----------+------+-----------------------------------------------------+
| Host | User | Password |
+-----------+------+-----------------------------------------------------+
| jackxiang | | |
| jackxiang |root | *2CD42BDFDF0EB0E*Z****3458EB72EE1F17F26F |
+-----------+------+------------------------------------------------------+
2)查下localhost,因为大都是限定本机连接,不让外面机器连接,确保安全:
mysql> select Host,User,Password from user where Host="localhost" limit 2;
+-----------+-----------------+-------------------------------------------+
| Host | User | Password |
+-----------+-----------------+-------------------------------------------+
| localhost | | |
| localhost | jack_mysql | *2CD42BDFDF0E***3458EB72EE1F17F26F |
+-----------+-----------------+-------------------------------------------+
3)把Host既是 jackxiang的,用户是空或root的Host修改为localhost:
mysql> update user set Host="localhost" where Host="jackxiang";
ERROR 1062 (23000): Duplicate entry 'localhost-' for key 'PRIMARY'
这样搞不行,得一个一个干掉,看有没有root同名的,查下:
mysql> select Host,User,Password from user where User="";
+-----------+------+----------+
| Host | User | Password |
+-----------+------+----------+
| localhost | | |
| jackxiang | | |
+-----------+------+----------+
mysql> delete from user where User="" and Password="";
Query OK, 2 rows affected (0.01 sec)
4)查下user为root的
mysql> select Host,User,Password from user where User="root";
+-----------+------+-------------------------------------------+
| Host | User | Password |
+-----------+------+-------------------------------------------+
| localhost | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| jackxiang | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| 127.0.0.1 | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| ::1 | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
+-----------+------+-------------------------------------------+
5)留下localhost就足够了,其余删除掉:
mysql> delete from user where Host !="localhost" and User="root";
Query OK, 3 rows affected (0.00 sec)
6)restart mysql:
日志warning还有一个:
[Warning] 'proxies_priv' entry '@ root@jackxiang' ignored in --skip-name-resolve mode.
解决办法:
然后删除表mysql.proxies_priv中和cvs类似与具体域名有关的行,方法同上。
mysql> select Host,User,Proxied_host,Proxied_user,With_grant,Grantor,Timestamp from proxies_priv ;
+-----------+------+--------------+--------------+------------+---------+----------------+
| Host | User | Proxied_host | Proxied_user | With_grant | Grantor | Timestamp |
+-----------+------+--------------+--------------+------------+---------+----------------+
| localhost | root | | | 1 | | 2014-07-14 13:26:08 |
| jackxiang | root | | | 1 | | 2014-07-14 13:26:08 |
+-----------+------+--------------+--------------+------------+---------+----------------+
mysql> delete from proxies_priv where Host="jackxiang";
Query OK, 1 row affected (0.02 sec)
这下彻底清静了。
原来是当时安装mysql后,多次grant授权引起的,。
备注:
skip-name-resolve是禁用dns解析,避免网络DNS解析服务引发访问MYSQL的错误,一般应当启用。 启用后,在mysql的授权表中就不能使用主机名了,只能使用IP ,出现此警告是由于mysql 表中已经存在有 root@jackxiang 帐号信息。 我们把它删除就好了。 mysql>use mysql; mysql> delete from user where HOST='localhost.localdomain'; Query OK, 2 rows affected (0.00 sec) 重启MYSQL ,发现警告已经没有啦。
来自:http://www.dedecms.com/knowledge/data-base/mysql/2012/0819/7084.html
http://blog.itpub.net/14184018/viewspace-1061224/
[root@jackxiang mysql]# vi my.cnf
skip-name-resolve
# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,
# 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求
实践如下:
重启mysql,发现日志还有:
1)按提示作下查询,果然有一个空账户和root帐户的Host是jackxiang:
select * from user where Host="jackxiang"\G;
mysql> select Host,User,Password from user where Host="jackxiang";
+-----------+------+-----------------------------------------------------+
| Host | User | Password |
+-----------+------+-----------------------------------------------------+
| jackxiang | | |
| jackxiang |root | *2CD42BDFDF0EB0E*Z****3458EB72EE1F17F26F |
+-----------+------+------------------------------------------------------+
2)查下localhost,因为大都是限定本机连接,不让外面机器连接,确保安全:
mysql> select Host,User,Password from user where Host="localhost" limit 2;
+-----------+-----------------+-------------------------------------------+
| Host | User | Password |
+-----------+-----------------+-------------------------------------------+
| localhost | | |
| localhost | jack_mysql | *2CD42BDFDF0E***3458EB72EE1F17F26F |
+-----------+-----------------+-------------------------------------------+
3)把Host既是 jackxiang的,用户是空或root的Host修改为localhost:
mysql> update user set Host="localhost" where Host="jackxiang";
ERROR 1062 (23000): Duplicate entry 'localhost-' for key 'PRIMARY'
这样搞不行,得一个一个干掉,看有没有root同名的,查下:
mysql> select Host,User,Password from user where User="";
+-----------+------+----------+
| Host | User | Password |
+-----------+------+----------+
| localhost | | |
| jackxiang | | |
+-----------+------+----------+
mysql> delete from user where User="" and Password="";
Query OK, 2 rows affected (0.01 sec)
4)查下user为root的
mysql> select Host,User,Password from user where User="root";
+-----------+------+-------------------------------------------+
| Host | User | Password |
+-----------+------+-------------------------------------------+
| localhost | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| jackxiang | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| 127.0.0.1 | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| ::1 | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
+-----------+------+-------------------------------------------+
5)留下localhost就足够了,其余删除掉:
mysql> delete from user where Host !="localhost" and User="root";
Query OK, 3 rows affected (0.00 sec)
6)restart mysql:
日志warning还有一个:
[Warning] 'proxies_priv' entry '@ root@jackxiang' ignored in --skip-name-resolve mode.
解决办法:
然后删除表mysql.proxies_priv中和cvs类似与具体域名有关的行,方法同上。
mysql> select Host,User,Proxied_host,Proxied_user,With_grant,Grantor,Timestamp from proxies_priv ;
+-----------+------+--------------+--------------+------------+---------+----------------+
| Host | User | Proxied_host | Proxied_user | With_grant | Grantor | Timestamp |
+-----------+------+--------------+--------------+------------+---------+----------------+
| localhost | root | | | 1 | | 2014-07-14 13:26:08 |
| jackxiang | root | | | 1 | | 2014-07-14 13:26:08 |
+-----------+------+--------------+--------------+------------+---------+----------------+
mysql> delete from proxies_priv where Host="jackxiang";
Query OK, 1 row affected (0.02 sec)
这下彻底清静了。
原来是当时安装mysql后,多次grant授权引起的,。
备注:
skip-name-resolve是禁用dns解析,避免网络DNS解析服务引发访问MYSQL的错误,一般应当启用。 启用后,在mysql的授权表中就不能使用主机名了,只能使用IP ,出现此警告是由于mysql 表中已经存在有 root@jackxiang 帐号信息。 我们把它删除就好了。 mysql>use mysql; mysql> delete from user where HOST='localhost.localdomain'; Query OK, 2 rows affected (0.00 sec) 重启MYSQL ,发现警告已经没有啦。
来自:http://www.dedecms.com/knowledge/data-base/mysql/2012/0819/7084.html
http://blog.itpub.net/14184018/viewspace-1061224/
MySQL的用户密码可以为特殊字符么?
不能出现"!" 其它都可以的。(MySQL用户密码中的特殊字符叹号(!)的妙用,把!后面的字符串做为命令执行了,在本文最后讲。)
但是当出现有* &号时,在登录时会出现:
mysql -uroot -pjack&*vac //这样是不行的(-p后不能有空格,否则还得输入密码,认为是db。),用双引号引起来也不行,最后,只能单引号,才能成功:
mysql -uroot -p'jack&*vac'
[root@jackxiang cache]# mysql -uroot p'jack&*vac'
mysql>
登录成功!
_______________________Mysql密码里包含叹号,其!后面的字符串做为命令执行了_______________________________
MySQL用户密码中的特殊字符叹号(!)的妙用:
这篇文章主要介绍了MySQL用户密码中的特殊字符叹号(!)的妙用,本文介绍的是如果你的密码中含有叹号(!),那么在控制台登录时会出现错误哦,需要的朋友可以参考下
使用叹号(!)禁止用户终端进入的一个方法。
mysql> grant all privileges on wubx.* to ‘wubx'@'172.16.100.185′ identified by ‘fd52!wubx&,';
Query OK, 0 rows affected (0.00 sec)
mysql>quit;
#mysql -h 172.16.100.185 -u wubx -pfd52!wubx&,
-bash: !wubx@,: event not found
仔细看一下,原来他把!后面的字符串做为命令执行了。又试了一个Navicat的管理端,也一样存在密码不正常的问题。
在测一下程序方面是不是可以用,写一个PHP测一下。
$link = mysql_connect('172.16.100.185′,'wubx','fd52!wubx&,');
if (!link){
die(‘Could not connect:'.mysql_error());
}
echo ‘Connected successfully';mysql_close($link);
?>
#php testdb.php
Connected successfully
还看程序中能正常识别。
PHP还是可以OK通过的。
摘自:http://www.jb51.net/article/52526.htm
不能出现"!" 其它都可以的。(MySQL用户密码中的特殊字符叹号(!)的妙用,把!后面的字符串做为命令执行了,在本文最后讲。)
但是当出现有* &号时,在登录时会出现:
mysql -uroot -pjack&*vac //这样是不行的(-p后不能有空格,否则还得输入密码,认为是db。),用双引号引起来也不行,最后,只能单引号,才能成功:
mysql -uroot -p'jack&*vac'
[root@jackxiang cache]# mysql -uroot p'jack&*vac'
mysql>
登录成功!
_______________________Mysql密码里包含叹号,其!后面的字符串做为命令执行了_______________________________
MySQL用户密码中的特殊字符叹号(!)的妙用:
这篇文章主要介绍了MySQL用户密码中的特殊字符叹号(!)的妙用,本文介绍的是如果你的密码中含有叹号(!),那么在控制台登录时会出现错误哦,需要的朋友可以参考下
使用叹号(!)禁止用户终端进入的一个方法。
mysql> grant all privileges on wubx.* to ‘wubx'@'172.16.100.185′ identified by ‘fd52!wubx&,';
Query OK, 0 rows affected (0.00 sec)
mysql>quit;
#mysql -h 172.16.100.185 -u wubx -pfd52!wubx&,
-bash: !wubx@,: event not found
仔细看一下,原来他把!后面的字符串做为命令执行了。又试了一个Navicat的管理端,也一样存在密码不正常的问题。
在测一下程序方面是不是可以用,写一个PHP测一下。
$link = mysql_connect('172.16.100.185′,'wubx','fd52!wubx&,');
if (!link){
die(‘Could not connect:'.mysql_error());
}
echo ‘Connected successfully';mysql_close($link);
?>
#php testdb.php
Connected successfully
还看程序中能正常识别。
PHP还是可以OK通过的。
摘自:http://www.jb51.net/article/52526.htm
背景:MYSQL多实例配置、dc提到在实际开发中,其实在生产环境上也有类似的运用,因多种原因,1.存储技术飞速发展,IO不再是瓶颈 2.MySQL对多核CPU利用率低 3.NUMA对MySQL性能的影响等,链接在:http://blog.csdn.net/hylongsuny/article/details/7892488 。
在实际的开发过程中,可能会需要在一台服务器上部署多个MYSQL实例,那建议使用MYSQL官方的解决方案 mysqld_multi
1.修改my.cnf
如一个定义两个实例的参考配置:
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = your_user
password = your_password
[mysqld1]
datadir = /data/db/my1
#连接
port = 3306
socket = /tmp/mysql3306.sock
#binlog
log-bin=/data/db/mylog1/mysql-bin
binlog_format=mixed
binlog_cache_size = 32M
expire_logs_days = 30
[mysqld2]
datadir = /data/db/my2
#连接
port = 3307
socket = /tmp/mysql3307.sock
#binlog
log-bin=/data/db/mylog2/mysql-bin
binlog_format=mixed
binlog_cache_size = 32M
expire_logs_days = 3
2.创建数据目录
mkdir -p /data/db/my21
mkdir -p /data/db/my2
chown mysql.mysql /data/db/my1 -R
chown mysql.mysql /data/db/my2 -R
3.初始化DB
/usr/local/mysql/scripts/mysql_install_db --datadir=/data/db/my1/ -uroot (mysql_install_db也是MYSQL官方自带工具)
/usr/local/mysql/scripts/mysql_install_db --datadir=/data/db/my2/ -uroot
chown mysql.mysql /data/db/my1/ -R
chown mysql.mysql /data/db/my2/ -R
4. 安装工具
cp /usr/local/mysql/bin/my_print_defaults /usr/bin/
cp /usr/local/mysql/bin/mysqld_multi /usr/bin/
5.创建、授权用户
CREATE USER "your_user"@"192.168.1.%" IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON *.* TO "your_user"@"192.168.1.%";
flush privileges;
至此,mysql多实例配置已经完毕。我们看到多个不同的MYSQL实例是共用my.cnf的。多实例命令行管理:
1.mysql启动
mysqld_multi start 1 启动实例1
mysqld_multi start 1-2 启动实例1,2
2.mysql重启
mysqld_multi restart 1 重启实例1
mysqld_multi restart 1-2 重启实例1,2
3.mysql关闭
mysqld_multi stop 1 关闭实例1
mysqld_multi stop 1-2 关闭实例1,2
4.命令行登陆实例2
mysql -u your_user -p your_password -P3307 -S /tmp/mysql3307.sock
摘自Dc(施俊伟)兄弟的唐品blog:
http://www.dcshi.com/?p=410#more-410
在实际的开发过程中,可能会需要在一台服务器上部署多个MYSQL实例,那建议使用MYSQL官方的解决方案 mysqld_multi
1.修改my.cnf
如一个定义两个实例的参考配置:
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = your_user
password = your_password
[mysqld1]
datadir = /data/db/my1
#连接
port = 3306
socket = /tmp/mysql3306.sock
#binlog
log-bin=/data/db/mylog1/mysql-bin
binlog_format=mixed
binlog_cache_size = 32M
expire_logs_days = 30
[mysqld2]
datadir = /data/db/my2
#连接
port = 3307
socket = /tmp/mysql3307.sock
#binlog
log-bin=/data/db/mylog2/mysql-bin
binlog_format=mixed
binlog_cache_size = 32M
expire_logs_days = 3
2.创建数据目录
mkdir -p /data/db/my21
mkdir -p /data/db/my2
chown mysql.mysql /data/db/my1 -R
chown mysql.mysql /data/db/my2 -R
3.初始化DB
/usr/local/mysql/scripts/mysql_install_db --datadir=/data/db/my1/ -uroot (mysql_install_db也是MYSQL官方自带工具)
/usr/local/mysql/scripts/mysql_install_db --datadir=/data/db/my2/ -uroot
chown mysql.mysql /data/db/my1/ -R
chown mysql.mysql /data/db/my2/ -R
4. 安装工具
cp /usr/local/mysql/bin/my_print_defaults /usr/bin/
cp /usr/local/mysql/bin/mysqld_multi /usr/bin/
5.创建、授权用户
CREATE USER "your_user"@"192.168.1.%" IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON *.* TO "your_user"@"192.168.1.%";
flush privileges;
至此,mysql多实例配置已经完毕。我们看到多个不同的MYSQL实例是共用my.cnf的。多实例命令行管理:
1.mysql启动
mysqld_multi start 1 启动实例1
mysqld_multi start 1-2 启动实例1,2
2.mysql重启
mysqld_multi restart 1 重启实例1
mysqld_multi restart 1-2 重启实例1,2
3.mysql关闭
mysqld_multi stop 1 关闭实例1
mysqld_multi stop 1-2 关闭实例1,2
4.命令行登陆实例2
mysql -u your_user -p your_password -P3307 -S /tmp/mysql3307.sock
摘自Dc(施俊伟)兄弟的唐品blog:
http://www.dcshi.com/?p=410#more-410
背景:我查一些按顺序的uuid,后用select in(uuid,uuid2...),查出来的顺序是按uuid ,uuid2么?会不会出现不一致的情况。
select * from table_name where id in ()的时候,MySQL会自动按主键自增排序,要是按给定的顺序来取,如何实现呢?
select * from table_name where id in (122,1,5,323,23,1200) order by find_in_set(id, '122,1,5,323,23,1200')
这样读取出来的顺序为 122,1,5,323,23,1200
来自:http://blog.163.com/zhaoyingzhaoying@yeah/blog/static/168024152201110149140931/
示例:
Mysql FIND_IN_SET 语句原始排序:
find_in_set()
问:
mysql中怎么按in语句中的id顺序取数据
select * from ecs_goods where goods_id in (14,1,33,23)
按14,1,33,23这个顺序取
答:
在程序中,$idList='14,1,33,23';
select * from ecs_goods where goods_id in ($idList) order by FIND_IN_SET(goods_id,'$idList')
来自:http://jianzhong5137.blog.163.com/blog/static/9829049201201421430839/
注意,这个find_in_set单条记录没问题,比如唯一id的in。多条记录order会失效(instr也不全行,大部分可以,不过对于特殊的,比如CD是会认为C也在里面的情况。):
select * from act_log where answer in ('B','C','CD') order by instr( "'B','C','CD'",answer)
正确排序: B,B,C
select * from act_log where answer in ('B','C','CD') order by find_in_set( answer,"'B','C','CD'")
排序错误:CD,C,BB,C。
select * from table_name where id in ()的时候,MySQL会自动按主键自增排序,要是按给定的顺序来取,如何实现呢?
select * from table_name where id in (122,1,5,323,23,1200) order by find_in_set(id, '122,1,5,323,23,1200')
这样读取出来的顺序为 122,1,5,323,23,1200
来自:http://blog.163.com/zhaoyingzhaoying@yeah/blog/static/168024152201110149140931/
示例:
Mysql FIND_IN_SET 语句原始排序:
find_in_set()
问:
mysql中怎么按in语句中的id顺序取数据
select * from ecs_goods where goods_id in (14,1,33,23)
按14,1,33,23这个顺序取
答:
在程序中,$idList='14,1,33,23';
select * from ecs_goods where goods_id in ($idList) order by FIND_IN_SET(goods_id,'$idList')
来自:http://jianzhong5137.blog.163.com/blog/static/9829049201201421430839/
注意,这个find_in_set单条记录没问题,比如唯一id的in。多条记录order会失效(instr也不全行,大部分可以,不过对于特殊的,比如CD是会认为C也在里面的情况。):
select * from act_log where answer in ('B','C','CD') order by instr( "'B','C','CD'",answer)
正确排序: B,B,C
select * from act_log where answer in ('B','C','CD') order by find_in_set( answer,"'B','C','CD'")
排序错误:CD,C,BB,C。
背景:mysql的严格模式有一句:my.cnf加了:sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",中间有一个:NO_AUTO_CREATE_USER。
参看:https://jackxiang.com/post/6810/
阅读全文
参看:https://jackxiang.com/post/6810/
阅读全文
[mysql]不要再执着于thread_concurrency
结论:
thread_concurrency 在GNU/Linux系统上没有用的。
不过很多LINUX自带的mysql包里面的配置文件都有thread_concurrency选项,
甚至Mysql官方源码里面的my-large.cnf my-innodb-heavy-4G.cnf里面也有。。
Xml代码 收藏代码
# This permits the application TO give the threads system a hint FOR the
# desired NUMBER OF threads that should be run at the same TIME. This
# VALUE ONLY makes sense ON systems that support the thread_concurrency()
# FUNCTION CALL (Sun Solaris, FOR example).
# You should try [NUMBER OF CPUs]*(2..4) FOR thread_concurrency
thread_concurrency = 8
于是在网上就流传开了,在一些优化mysql配置的文章中,都说要把thread_concurrency设置为 CPU核数*2。
但是千万别上当,调整这个选项纯属浪费时间。
它只在Solaris < 9 的系统中有用。。。
而且从mysql5.6.1开始,这个选项就被废了。
http://bugs.mysql.com/bug.php?id=55001
INNODB:
innodb_thread_concurrency = 128
innodb_purge_threads = 32 # 5.6之后才支持大于1, 5.5上会自动变成1
# 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量
结论:
thread_concurrency 在GNU/Linux系统上没有用的。
不过很多LINUX自带的mysql包里面的配置文件都有thread_concurrency选项,
甚至Mysql官方源码里面的my-large.cnf my-innodb-heavy-4G.cnf里面也有。。
Xml代码 收藏代码
# This permits the application TO give the threads system a hint FOR the
# desired NUMBER OF threads that should be run at the same TIME. This
# VALUE ONLY makes sense ON systems that support the thread_concurrency()
# FUNCTION CALL (Sun Solaris, FOR example).
# You should try [NUMBER OF CPUs]*(2..4) FOR thread_concurrency
thread_concurrency = 8
于是在网上就流传开了,在一些优化mysql配置的文章中,都说要把thread_concurrency设置为 CPU核数*2。
但是千万别上当,调整这个选项纯属浪费时间。
它只在Solaris < 9 的系统中有用。。。
而且从mysql5.6.1开始,这个选项就被废了。
http://bugs.mysql.com/bug.php?id=55001
INNODB:
innodb_thread_concurrency = 128
innodb_purge_threads = 32 # 5.6之后才支持大于1, 5.5上会自动变成1
# 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量
转至 http://blog.netzhou.net/?p=93
基本上用了mysql作为oltp业务的,基本上都会配置mysql的主从,一方面用mysql的主从做数据库的读写分离,另一方面mysql本身的单机备份不是很强,一般采用主从架构,在从上进行数据备份。
在这过程中或多或少出现一些主从不同步的情况,本文将对数据主从不同步的情况进行简单的总结,在看这篇文章请注意了本文主要从数据库层面上探讨数据库的主从不一致的情况,并不对主从的本身数据不一致引起的主从不同步进行说明:
1.网络的延迟
由于mysql主从复制是基于binlog的一种异步复制,通过网络传送binlog文件,理所当然网络延迟是主从不同步的绝大多数的原因,特别是跨机房的数据同步出现这种几率非常的大,所以做读写分离,注意从业务层进行前期设计。
2.主从两台机器的负载不一致
由于mysql主从复制是主上面启动1个io线程,而从上面启动1个sql线程和1个io线程,当中任何一台机器的负载很高,忙不过来,导致其中的任何一个线程出现资源不足,都将出现主从不一致的情况。
3.max_allowed_packet设置不一致
主上面设置的max_allowed_packet比从大,当一个大的sql语句,能在主上面执行完毕,从上面设置过小,无法执行,导致的主从不一致。
4.key自增键开始的键值跟自增步长设置不一致引起的主从不一致。
5.mysql异常宕机情况下,如果未设置sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出现binlog或者relaylog文件出现损坏,导致主从不一致。
6.mysql本身的bug引起的主从不同步。
7.版本不一致,特别是高版本是主,低版本为从的情况下,主上面支持的功能,从上面不支持该功能。
以上是我遇到的一些主从不同步的情况。或许还有其他的一些不同步的情况,请说出你所遇到的主从不一致的情况。
基于以上情况,先保证max_allowed_packet,自增键开始点和增长点设置一致,再者牺牲部分性能在主上面开启sync_binlog,对于采用innodb的库,推荐配置下面的内容
innodb_flush_logs_at_trx_commit = 1
innodb-support_xa = 1 # Mysql 5.0 以上
innodb_safe_binlog # Mysql 4.0
同时在从上面推荐加入下面两个参数
skip_slave_start
read_only
基本上用了mysql作为oltp业务的,基本上都会配置mysql的主从,一方面用mysql的主从做数据库的读写分离,另一方面mysql本身的单机备份不是很强,一般采用主从架构,在从上进行数据备份。
在这过程中或多或少出现一些主从不同步的情况,本文将对数据主从不同步的情况进行简单的总结,在看这篇文章请注意了本文主要从数据库层面上探讨数据库的主从不一致的情况,并不对主从的本身数据不一致引起的主从不同步进行说明:
1.网络的延迟
由于mysql主从复制是基于binlog的一种异步复制,通过网络传送binlog文件,理所当然网络延迟是主从不同步的绝大多数的原因,特别是跨机房的数据同步出现这种几率非常的大,所以做读写分离,注意从业务层进行前期设计。
2.主从两台机器的负载不一致
由于mysql主从复制是主上面启动1个io线程,而从上面启动1个sql线程和1个io线程,当中任何一台机器的负载很高,忙不过来,导致其中的任何一个线程出现资源不足,都将出现主从不一致的情况。
3.max_allowed_packet设置不一致
主上面设置的max_allowed_packet比从大,当一个大的sql语句,能在主上面执行完毕,从上面设置过小,无法执行,导致的主从不一致。
4.key自增键开始的键值跟自增步长设置不一致引起的主从不一致。
5.mysql异常宕机情况下,如果未设置sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出现binlog或者relaylog文件出现损坏,导致主从不一致。
6.mysql本身的bug引起的主从不同步。
7.版本不一致,特别是高版本是主,低版本为从的情况下,主上面支持的功能,从上面不支持该功能。
以上是我遇到的一些主从不同步的情况。或许还有其他的一些不同步的情况,请说出你所遇到的主从不一致的情况。
基于以上情况,先保证max_allowed_packet,自增键开始点和增长点设置一致,再者牺牲部分性能在主上面开启sync_binlog,对于采用innodb的库,推荐配置下面的内容
innodb_flush_logs_at_trx_commit = 1
innodb-support_xa = 1 # Mysql 5.0 以上
innodb_safe_binlog # Mysql 4.0
同时在从上面推荐加入下面两个参数
skip_slave_start
read_only
背景:MySQL-Fullltext: 使用 MySQL 实现简单的搜索引擎,搜索下博文啥的,方便自己。
http://blog.csdn.net/zajin/article/details/10970207
零、 Mysql下的Web程序,如何实现全文检索:
使用逻辑搜索修饰符(Boolean search modifiers)
++表示必须
+表示要有的-表示不能有的
不带+或者-表示,任意一种
http://blog.csdn.net/froole/article/details/3497907
阅读全文
http://blog.csdn.net/zajin/article/details/10970207
零、 Mysql下的Web程序,如何实现全文检索:
使用逻辑搜索修饰符(Boolean search modifiers)
++表示必须
+表示要有的-表示不能有的
不带+或者-表示,任意一种
http://blog.csdn.net/froole/article/details/3497907
阅读全文
背景:Mysql新版本的慢查询配置和旧的版本不太一样,为此,特转下这这篇文章,以备案。近来发现我们用程序写啥慢sql还不如包自己带呢,
MySQL分支 Percona 5.6.15 发布: http://www.open-open.com/news/view/18ed41c ,这自己带着杀sql的功能: Percona5.6自身已支持杀死慢SQL, http://hcymysql.blog.51cto.com/5223301/1621218
零、关闭mysql:
一、Mysql启动参数 -u root:
二、配置my.cnf如下:
mysql版本:
mysql> select version();
+------------+
| version() |
+------------+
| 5.6.13-log |
+------------+
1 row in set (0.00 sec)
[root@mysql_multi ~]# vi /etc/my.cnf
【mysqld3307】
long_query_time=1
#slow_query_log
slow_query_log=1
#slow_query_log_file=/data/mysql/mysqldata3307/log/slow-query.log
#以前版本的参数格式跟5.6的不一致
slow_query_log_file=/data/mysql/mysqldata3307/log/slow-query.log
#将所有没有使用带索引的查询语句全部写到慢查询日志中
log_queries_not_using_indexes=1
对 3307 端口的mysql:
[root@mysql_multi ~]# mysqld_multi start 3307
[root@mysql_multi ~]# netstat -nlp|grep mysql
tcp 0 0 :::3306 :::* LISTEN 20211/mysqld
tcp 0 0 :::3307 :::* LISTEN 18693/mysqld
unix 2 [ ACC ] STREAM LISTENING 42309 20211/mysqld /data/mysql/mysqldata3306/sock/mysql.sock
unix 2 [ ACC ] STREAM LISTENING 69806 18693/mysqld /data/mysql/mysqldata3307/sock/mysql.sock
root@localhost : mysql 01:00:16> show variables like '%slow%';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: mysql
+---------------------------+----------------------------------------------+
| Variable_name | Value |
+---------------------------+----------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /data/mysql/mysqldata3307/log/slow-query.log |
+---------------------------+----------------------------------------------+
5 rows in set (0.00 sec)
root@localhost : mysql 01:03:44> show variables like '%index%';
+----------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------+-------+
| eq_range_index_dive_limit | 10 |
| innodb_adaptive_hash_index | ON |
| innodb_cmp_per_index_enabled | OFF |
| log_bin_index | |
| log_queries_not_using_indexes | ON |
| log_throttle_queries_not_using_indexes | 0 |
| relay_log_index | |
+----------------------------------------+-------+
7 rows in set (0.00 sec)
然后运行一个需要长时间才能执行完毕的sql,
select sleep(2);
使用mysqldumpslow 查看日志:
/data/mysql/mysqldata3307/log/slow-query.log (直接使用cat 进行查看也可以)
转自:http://blog.itpub.net/29291882/viewspace-1064074
实践如下:
一、
vi /usr/local/mysql/conf/my.cnf
slow_query_log=1
long_query_time = 2
slow_query_log_file=/data/db/mysql/localhost-slow.log
#将所有没有使用带索引的查询语句全部写到慢查询日志中
log_queries_not_using_indexes=1
#如果开启了log_queries_not_using_indexes选项,slow query日志会充满过多的垃圾日志记录,这些快且高效的全表扫描查询(表小)会冲掉真正有用的slow queries记录。比如select * from category这样的查询也会被记录下来。
二、
mysql> show variables like '%slow%';
+---------------------------+-----------------------------------+
| Variable_name | Value |
+---------------------------+-----------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /data/db/mysql/localhost-slow.log |
+---------------------------+-----------------------------------+
三、
du -sh /data/db/mysql/localhost-slow.log
803M /data/db/mysql/localhost-slow.log
四、
Mysql 测试配置文件是否正确 my.cnf,那个nginx 有-t,mysql呢?
一)这个没必要重启,直接 set @@global.slow_query_log=1;
二)起动一个新端口的副本测试,有道理。
mysql> show variables like '%slow%';
+---------------------------+--------------------------------------------+
| Variable_name | Value |
+---------------------------+--------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /data/db/mysql/localhost-xiyou-slowsql.log |
+---------------------------+--------------------------------------------
__________________________________________
mysql5.6和5.5中打开slow_query_log的方式有所改变:
mysql5.6.10关于慢查询的设置slow-query-log
前两天,刚把开发用的环境升级为2008R2,,所以想试试5.6.10的64位的数据库,是在mysql的官方下载的win32x64版本,一共有200多M。发现里面只有一个默认的my.ini文件,想进行优化试试,结果发现老是启动不了。后来发现,主要是这个关于慢查询的设置变了,之前是:
slow_query_log
long_query_time = 5
log-slow-queries=slow.log
现在必须要这种设置才行
slow_query_log=1
slow_query_log_file=slow.log
看来从5.6.* 可能已经全面取消了
log_slow_queries=slow.log这种写法了
来自:http://www.2cto.com/database/201304/203100.html
MySQL分支 Percona 5.6.15 发布: http://www.open-open.com/news/view/18ed41c ,这自己带着杀sql的功能: Percona5.6自身已支持杀死慢SQL, http://hcymysql.blog.51cto.com/5223301/1621218
零、关闭mysql:
一、Mysql启动参数 -u root:
二、配置my.cnf如下:
mysql版本:
mysql> select version();
+------------+
| version() |
+------------+
| 5.6.13-log |
+------------+
1 row in set (0.00 sec)
[root@mysql_multi ~]# vi /etc/my.cnf
【mysqld3307】
long_query_time=1
#slow_query_log
slow_query_log=1
#slow_query_log_file=/data/mysql/mysqldata3307/log/slow-query.log
#以前版本的参数格式跟5.6的不一致
slow_query_log_file=/data/mysql/mysqldata3307/log/slow-query.log
#将所有没有使用带索引的查询语句全部写到慢查询日志中
log_queries_not_using_indexes=1
对 3307 端口的mysql:
[root@mysql_multi ~]# mysqld_multi start 3307
[root@mysql_multi ~]# netstat -nlp|grep mysql
tcp 0 0 :::3306 :::* LISTEN 20211/mysqld
tcp 0 0 :::3307 :::* LISTEN 18693/mysqld
unix 2 [ ACC ] STREAM LISTENING 42309 20211/mysqld /data/mysql/mysqldata3306/sock/mysql.sock
unix 2 [ ACC ] STREAM LISTENING 69806 18693/mysqld /data/mysql/mysqldata3307/sock/mysql.sock
root@localhost : mysql 01:00:16> show variables like '%slow%';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: mysql
+---------------------------+----------------------------------------------+
| Variable_name | Value |
+---------------------------+----------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /data/mysql/mysqldata3307/log/slow-query.log |
+---------------------------+----------------------------------------------+
5 rows in set (0.00 sec)
root@localhost : mysql 01:03:44> show variables like '%index%';
+----------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------+-------+
| eq_range_index_dive_limit | 10 |
| innodb_adaptive_hash_index | ON |
| innodb_cmp_per_index_enabled | OFF |
| log_bin_index | |
| log_queries_not_using_indexes | ON |
| log_throttle_queries_not_using_indexes | 0 |
| relay_log_index | |
+----------------------------------------+-------+
7 rows in set (0.00 sec)
然后运行一个需要长时间才能执行完毕的sql,
select sleep(2);
使用mysqldumpslow 查看日志:
/data/mysql/mysqldata3307/log/slow-query.log (直接使用cat 进行查看也可以)
转自:http://blog.itpub.net/29291882/viewspace-1064074
实践如下:
一、
vi /usr/local/mysql/conf/my.cnf
slow_query_log=1
long_query_time = 2
slow_query_log_file=/data/db/mysql/localhost-slow.log
#将所有没有使用带索引的查询语句全部写到慢查询日志中
log_queries_not_using_indexes=1
#如果开启了log_queries_not_using_indexes选项,slow query日志会充满过多的垃圾日志记录,这些快且高效的全表扫描查询(表小)会冲掉真正有用的slow queries记录。比如select * from category这样的查询也会被记录下来。
二、
mysql> show variables like '%slow%';
+---------------------------+-----------------------------------+
| Variable_name | Value |
+---------------------------+-----------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /data/db/mysql/localhost-slow.log |
+---------------------------+-----------------------------------+
三、
du -sh /data/db/mysql/localhost-slow.log
803M /data/db/mysql/localhost-slow.log
四、
Mysql 测试配置文件是否正确 my.cnf,那个nginx 有-t,mysql呢?
一)这个没必要重启,直接 set @@global.slow_query_log=1;
二)起动一个新端口的副本测试,有道理。
mysql> show variables like '%slow%';
+---------------------------+--------------------------------------------+
| Variable_name | Value |
+---------------------------+--------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /data/db/mysql/localhost-xiyou-slowsql.log |
+---------------------------+--------------------------------------------
__________________________________________
mysql5.6和5.5中打开slow_query_log的方式有所改变:
mysql5.6.10关于慢查询的设置slow-query-log
前两天,刚把开发用的环境升级为2008R2,,所以想试试5.6.10的64位的数据库,是在mysql的官方下载的win32x64版本,一共有200多M。发现里面只有一个默认的my.ini文件,想进行优化试试,结果发现老是启动不了。后来发现,主要是这个关于慢查询的设置变了,之前是:
slow_query_log
long_query_time = 5
log-slow-queries=slow.log
现在必须要这种设置才行
slow_query_log=1
slow_query_log_file=slow.log
看来从5.6.* 可能已经全面取消了
log_slow_queries=slow.log这种写法了
来自:http://www.2cto.com/database/201304/203100.html
背景:搞个个人博客的全文搜索得用like啥的,现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了,刚查了下目前版本号都到MySQL Community Server 5.6.19 了,所以,一些小的应用可以用它做全文搜索了,像sphinx和Lucene这样偏重的、需要配置或开发的,节省了成本。
这儿有一个原创的Mysql全文搜索的文章, mysql的全文搜索功能:
http://blog.csdn.net/bravekingzhang/article/details/6727541
基于mysql全文索引的深入理解:
http://www.jb51.net/article/37738.htm
为什么要设置 Mysql 的 ft_min_word_len=1:
http://blog.csdn.net/shilian_h/article/details/6215537
MySQL 全文搜索支持简述:
从MySQL 4.0以上 myisam引擎就支持了full text search 全文搜索,在一般的小网站或者blog上可以使用这个特性支持搜索。
那么怎么使用了,简单看看:
1.创建一个表,指定支持fulltext的列
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
);
2.插入一些数据作为测试
INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. YourSQL','In the following database comparison ...'),
('MySQL Security','When configured properly, MySQL ...');
3.select查询fulltext的列
SELECT * FROM articles
WHERE MATCH (title,body) AGAINST ('database');
查询结果:
5 MySQL vs. YourSQL In the following database comparison ...
1 MySQL Tutorial DBMS stands for DataBase ...
全文查询中的boolean语句, + -跟普通的搜索引擎语法一样
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
innodb不支持fulltext,当然可以使用http://sphinxsearch.com/ sphinx来dump数据库数据支持全文搜索。
原文地址:http://www.javaarch.net/jiagoushi/700.htm
后记,MySQL 5.6.4里才添加了InnoDB引擎的Full-Text索引支持,或用张宴兄弟的基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计: http://blog.s135.com/post/360/
Q:
我想在查询时使用MATCH(...) AGAINST(...)语法,但是我的数据表引擎是Innodb,当我CREATE FULLTEXT INDEX的时候,返回提示The used table type doesn't support FULLTEXT indexes。
我想问的是在innodb引擎中是否不能使用FULLTEXT引擎?有什么替代品吗?可以使用MATCH(...) AGAINST(...)语法吗?
A:
MySQL 5.6.4里才添加了InnoDB引擎的Full-Text索引支持。
不能升级MySQL版本的话:
推荐用Lucene(ElasticSearch比较容易部署)或Sphinx这样的第三方解决方案。
innodb 不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
sphinx 是一个开源软件,提供多种语言的API接口,可以优化mysql的各种查询。
如果这个表更新不频繁,查询量不大,又赶时间,可以用触发器、定时任务或者其他类似的DBA技巧创建支持全文索引的镜像表(如MyISAM类型的),代码改动会小一些。
MySQL5.6 InnoDB FULLTEXTIndexes研究测试:
http://blog.csdn.net/zyz511919766/article/details/12780173
mysql 5.6.4支持nosql:
在最新的 mysql-5.6.4-labs-innodb-memcached 中,实现了简单的给予 key/value的nosql功能,其主要原理
就是mysqld除了监听3306端口之外,同时监听11211端口。使mysqld和memcached服务处在同一进程中。通过
数据库、表与字段的映射,将缓存在memcache的数据插入到映射的表中。安装包中提供了三张表:containers
cache_policies和config_options,表containers就提供了映射关系,表cache_policies提供了三种存储方式(
innodb_only数据只插入表,cache_only只缓存数据,caching即缓存数据又插入表),表config_options中提供
了一个默认分隔符“|”,就是说如果在表containers的values字段中定义了col1,col2...字段,那在设置缓存值时就
可以用val1|val2的形式,这样将会把val1插入到col1,val2插入到col2。
来自:http://blog.csdn.net/sunny5211/article/details/7357893
这个不能算是全文搜索, 只是传统的全表搜索。如果使用mysql的全文检查,在200万数据集上,不可能用那么长的时间的。
使用mysql全文检索的方法如下:
1. 配置mysql参数ft_min_word_len=1
在数据表的文本字段中创建fulltext索引。
2.将原始文本进行分词(处理成按空格分隔的字符串),可使用一些开源的分词模块实现。 再导入到mysql数据表中
3. 使用mysq select * from tb1 where title match'词语' 进行检索。
来自:http://www.oschina.net/question/123890_133459
这儿有一个原创的Mysql全文搜索的文章, mysql的全文搜索功能:
http://blog.csdn.net/bravekingzhang/article/details/6727541
基于mysql全文索引的深入理解:
http://www.jb51.net/article/37738.htm
为什么要设置 Mysql 的 ft_min_word_len=1:
http://blog.csdn.net/shilian_h/article/details/6215537
MySQL 全文搜索支持简述:
从MySQL 4.0以上 myisam引擎就支持了full text search 全文搜索,在一般的小网站或者blog上可以使用这个特性支持搜索。
那么怎么使用了,简单看看:
1.创建一个表,指定支持fulltext的列
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
);
2.插入一些数据作为测试
INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. YourSQL','In the following database comparison ...'),
('MySQL Security','When configured properly, MySQL ...');
3.select查询fulltext的列
SELECT * FROM articles
WHERE MATCH (title,body) AGAINST ('database');
查询结果:
5 MySQL vs. YourSQL In the following database comparison ...
1 MySQL Tutorial DBMS stands for DataBase ...
全文查询中的boolean语句, + -跟普通的搜索引擎语法一样
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
innodb不支持fulltext,当然可以使用http://sphinxsearch.com/ sphinx来dump数据库数据支持全文搜索。
原文地址:http://www.javaarch.net/jiagoushi/700.htm
后记,MySQL 5.6.4里才添加了InnoDB引擎的Full-Text索引支持,或用张宴兄弟的基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计: http://blog.s135.com/post/360/
Q:
我想在查询时使用MATCH(...) AGAINST(...)语法,但是我的数据表引擎是Innodb,当我CREATE FULLTEXT INDEX的时候,返回提示The used table type doesn't support FULLTEXT indexes。
我想问的是在innodb引擎中是否不能使用FULLTEXT引擎?有什么替代品吗?可以使用MATCH(...) AGAINST(...)语法吗?
A:
MySQL 5.6.4里才添加了InnoDB引擎的Full-Text索引支持。
不能升级MySQL版本的话:
推荐用Lucene(ElasticSearch比较容易部署)或Sphinx这样的第三方解决方案。
innodb 不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
sphinx 是一个开源软件,提供多种语言的API接口,可以优化mysql的各种查询。
如果这个表更新不频繁,查询量不大,又赶时间,可以用触发器、定时任务或者其他类似的DBA技巧创建支持全文索引的镜像表(如MyISAM类型的),代码改动会小一些。
MySQL5.6 InnoDB FULLTEXTIndexes研究测试:
http://blog.csdn.net/zyz511919766/article/details/12780173
mysql 5.6.4支持nosql:
在最新的 mysql-5.6.4-labs-innodb-memcached 中,实现了简单的给予 key/value的nosql功能,其主要原理
就是mysqld除了监听3306端口之外,同时监听11211端口。使mysqld和memcached服务处在同一进程中。通过
数据库、表与字段的映射,将缓存在memcache的数据插入到映射的表中。安装包中提供了三张表:containers
cache_policies和config_options,表containers就提供了映射关系,表cache_policies提供了三种存储方式(
innodb_only数据只插入表,cache_only只缓存数据,caching即缓存数据又插入表),表config_options中提供
了一个默认分隔符“|”,就是说如果在表containers的values字段中定义了col1,col2...字段,那在设置缓存值时就
可以用val1|val2的形式,这样将会把val1插入到col1,val2插入到col2。
来自:http://blog.csdn.net/sunny5211/article/details/7357893
这个不能算是全文搜索, 只是传统的全表搜索。如果使用mysql的全文检查,在200万数据集上,不可能用那么长的时间的。
使用mysql全文检索的方法如下:
1. 配置mysql参数ft_min_word_len=1
在数据表的文本字段中创建fulltext索引。
2.将原始文本进行分词(处理成按空格分隔的字符串),可使用一些开源的分词模块实现。 再导入到mysql数据表中
3. 使用mysq select * from tb1 where title match'词语' 进行检索。
来自:http://www.oschina.net/question/123890_133459