怎么看我的mysql数据库表的存储引擎类型

回复

Mysql匿名用户 回复了问题 • 1 人关注 • 1 个回复 • 224 次浏览 • 2016-11-20 22:39 • 来自相关话题

Linux忘记mysql root密码解决方法

Mysqllinyu520 发表了文章 • 0 个评论 • 305 次浏览 • 2016-11-20 15:52 • 来自相关话题

一、使用跳过权限检查的方式运行MySQL服务:
  要使用跳过权限检查的方式运行MySQL服务,有两种方式:1、在mysql服务的配置文件中添加“skip-grant-tables”选项;2、在启动mysql服务的命令后添加“--skip-grant-tables”选项。下面分别讲述两种方法:
 
方法一:修改配置文件的方式:
  修改mysql服务的配置文件“/etc/my.cnf”(根据你的安装方式不同,路径也可能不同),在“[mysqld]”配置组下添加一行“skip-grant-tables”后保存:[mysqld]
...爱E族..aiezu.com..省略N行...
skip-grant-tables保存后,重启“mysqld”服务,这时登录mysql就不再需要密码了。
 
方法二:在启动命令的后添加选项的方式:
  在linux终端运行下面命令,停止并重新以“跳过权限检查”的方式运行mysql服务,登录mysql即可不在需要密码:/etc/init.d/mysql stop
/etc/init.d/mysql start --mysqld --skip-grant-tables
二、设置新密码:
  按上步操作后,在终端运行“mysql -u root”命令,免密码进入mysql的sql命令行,并执行下面SQL语句设置新密码:
use mysql;
--将root密码设置为“aiezu.com”
update user set password=PASSWORD("aiezu.com") where user='root';
flush privileges  注意:在“skip-grant-tables”模式下,不要尝试使用“mysqladmin password”命令修改密码,否则将会报如下错误:[root@aiezu.com ~]# mysqladmin password
New password:
Confirm new password:
mysqladmin:
You cannot use 'password' command as mysqld runs
with grant tables disabled (was started with --skip-grant-tables).
Use: "mysqladmin flush-privileges password '*'" instead 
三、恢复正常启动方式:
  根据第一步的操作不同,选择下面两种方式之一将mysqld服务由“跳过权限检查”模式转换为正常模式,这样就可以使用新设置的密码登录了: 在“my.cnf”配置文件中去掉“skip-grant-tables”,并重启“mysqld”服务;停止mysqld服务,并再启动mysqld服务(去掉“--skip-grant-tables”选项) 
 
[size=14]  本文介绍的是Linux忘记mysql root密码解决方法,如果是Windows忘记了root密码,可以参考:[/size]Windows忘记mysql root密码解决方法 查看全部
一、使用跳过权限检查的方式运行MySQL服务:
  要使用跳过权限检查的方式运行MySQL服务,有两种方式:1、在mysql服务的配置文件中添加“skip-grant-tables”选项;2、在启动mysql服务的命令后添加“--skip-grant-tables”选项。下面分别讲述两种方法:
 
方法一:修改配置文件的方式:
  修改mysql服务的配置文件“/etc/my.cnf”(根据你的安装方式不同,路径也可能不同),在“[mysqld]”配置组下添加一行“skip-grant-tables”后保存:
[mysqld]
...爱E族..aiezu.com..省略N行...
skip-grant-tables
保存后,重启“mysqld”服务,这时登录mysql就不再需要密码了。
 
方法二:在启动命令的后添加选项的方式:
  在linux终端运行下面命令,停止并重新以“跳过权限检查”的方式运行mysql服务,登录mysql即可不在需要密码:
/etc/init.d/mysql stop
/etc/init.d/mysql start --mysqld --skip-grant-tables

二、设置新密码:
  按上步操作后,在终端运行“mysql -u root”命令,免密码进入mysql的sql命令行,并执行下面SQL语句设置新密码:
use mysql;
--将root密码设置为“aiezu.com”
update user set password=PASSWORD("aiezu.com") where user='root';
flush privileges
  注意:在“skip-grant-tables”模式下,不要尝试使用“mysqladmin password”命令修改密码,否则将会报如下错误:
[root@aiezu.com ~]# mysqladmin password
New password:
Confirm new password:
mysqladmin:
You cannot use 'password' command as mysqld runs
with grant tables disabled (was started with --skip-grant-tables).
Use: "mysqladmin flush-privileges password '*'" instead
 
三、恢复正常启动方式:
  根据第一步的操作不同,选择下面两种方式之一将mysqld服务由“跳过权限检查”模式转换为正常模式,这样就可以使用新设置的密码登录了: 
  • 在“my.cnf”配置文件中去掉“skip-grant-tables”,并重启“mysqld”服务;
  • 停止mysqld服务,并再启动mysqld服务(去掉“--skip-grant-tables”选项)
 
 
[size=14]  本文介绍的是Linux忘记mysql root密码解决方法,如果是Windows忘记了root密码,可以参考:[/size]Windows忘记mysql root密码解决方法

MySQL修改root密码

回复

Mysql匿名用户 回复了问题 • 1 人关注 • 1 个回复 • 220 次浏览 • 2016-11-20 20:37 • 来自相关话题

mysql错误ERROR 1064 (42000)

回复

Mysqllinyu520 回复了问题 • 1 人关注 • 1 个回复 • 282 次浏览 • 2016-11-18 12:41 • 来自相关话题

让Mysql支持事务处理(修改数据库的存储引擎类型)

Mysqllinyu520 发表了文章 • 0 个评论 • 184 次浏览 • 2016-11-18 10:39 • 来自相关话题

  有时我们发现我们的Mysql数据库使用事务时无效,这很有可能是数据库使用的存储引擎(storage engine)不支持事务处理。比如创建数据库时的默认存储引擎“MyISAM”,它是性能优先的存储引擎,不支持事务处理。这时我们可以按下面步骤处理,解决MySQL不支持事务的问题。
 
一、查看数据库的存储引擎:
1、查看MySQL系统当前使用的存储引擎:
  使用SQL“show variables like '%storage_engine%';”命令,可以查看MySQL系统当前使用的存储引擎:MariaDB [aiezu]> show variables like '%storage_engine%';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | MyISAM |
| storage_engine | MyISAM |
+------------------------+--------+
2 rows in set (0.01 sec) 
2、查看指定数据库所有表使用的存储引擎:
  使用“show table status from aiezu;”命令,可以查看指定数据库所有表使用的存储引擎,其中“aiezu”为数据库名。

3、查看指定表的存储引擎:MariaDB [aiezu]> show create table test;
+-------+---------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------+
| test | CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(36) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
+-------+----------------------------------------------------------+
1 row in set (0.00 sec) 
二、查看当前数据库系统支持的引擎:
  使用show engines;命令可以查看当前数据库支持的引擎:


可以看出,笔者用的MariaDB-5.5.47,支持10种存储引擎,而这10种存储引擎中,只有“InnoDB”、“FEDERATED” 这两种存储引擎支持事务处理。
 
三、修改数据库存储引擎:
1、修改整个系统创建数据表时的默认存储引擎:
  要让以后新建的数据表,默认使用支持事务处理的“InnoDB”做为默认存储引擎,修改“/etc/my.conf”文件,在“[mysqld]”下添加一行“default-storage-engine=InnoDB”,然后重启数据库即可:[mysqld]
...省略N行,爱E族 aiezu.com ...
default-storage-engine=InnoDB 
2、修改已有数据表的存储引擎:
  要将已有的数据表,修改为使用“InnoDB”作为默认存储引擎,通过“alter table”命令:
低版本:mysql> alter table test type=INNODB;
Query OK, 0 rows affected, 1 warning (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0高版本:MariaDB [aiezu]> alter table test ENGINE=INNODB;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0 
四、测试MySQL事务处理:
  MySQL使用BEGIN(或START TRANSACTION)、COMMIT、ROLLBACK三命令分别代表开始一个事务、提交事务、回滚事务,事务简单的流程如下:--回滚的事务
BEGIN;
-- 事务要执行的操作,update、delete等..
ROLLBACK;

--提交的事务
BEGIN;
-- 事务要执行的操作,update、delete等..
COMMIT;
 事务的简单例子:MariaDB [aiezu]> truncate table test;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> BEGIN;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> insert test(name,url) values('天猫','tmall.com');
Query OK, 1 row affected (0.00 sec)

MariaDB [aiezu]> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> insert test(name,url) values('爱E族','aiezu.com');
Query OK, 1 row affected (0.01 sec)

MariaDB [aiezu]> select * from test;
+----+---------+-----------+
| id | name | url |
+----+---------+-----------+
| 2 | 爱E族 | aiezu.com |
+----+---------+-----------+
1 row in set (0.00 sec)  上面可以看出,插入的站点“天猫”,由于在事务里,事务被回滚,所以插入被撤销。但是它的“id:1”已经被其占用,所以后面成功插入的站点“爱E族”使用的ID是“2”。
 
五、常见错误:
错误一:ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'type=innodb' at line 1解决方法:
  这个错误是当前MySQL版本不支持type方式设置存储引擎的,将type关键词改成ENGINE 即可。alter table test type=INNODB; --低版本
alter table test ENGINE=INNODB; --高版本 查看全部
  有时我们发现我们的Mysql数据库使用事务时无效,这很有可能是数据库使用的存储引擎(storage engine)不支持事务处理。比如创建数据库时的默认存储引擎“MyISAM”,它是性能优先的存储引擎,不支持事务处理。这时我们可以按下面步骤处理,解决MySQL不支持事务的问题。
 
一、查看数据库的存储引擎:
1、查看MySQL系统当前使用的存储引擎:
  使用SQL“show variables like '%storage_engine%';”命令,可以查看MySQL系统当前使用的存储引擎:
MariaDB [aiezu]> show variables like '%storage_engine%';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | MyISAM |
| storage_engine | MyISAM |
+------------------------+--------+
2 rows in set (0.01 sec)
 
2、查看指定数据库所有表使用的存储引擎:
  使用“show table status from aiezu;”命令,可以查看指定数据库所有表使用的存储引擎,其中“aiezu”为数据库名。

3、查看指定表的存储引擎:
MariaDB [aiezu]> show create table test;
+-------+---------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------+
| test | CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(36) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
+-------+----------------------------------------------------------+
1 row in set (0.00 sec)
 
二、查看当前数据库系统支持的引擎:
  使用show engines;命令可以查看当前数据库支持的引擎:
QQ图片20161118104554.png
可以看出,笔者用的MariaDB-5.5.47,支持10种存储引擎,而这10种存储引擎中,只有“InnoDB”、“FEDERATED” 这两种存储引擎支持事务处理。
 
三、修改数据库存储引擎:
1、修改整个系统创建数据表时的默认存储引擎:
  要让以后新建的数据表,默认使用支持事务处理的“InnoDB”做为默认存储引擎,修改“/etc/my.conf”文件,在“[mysqld]”下添加一行“default-storage-engine=InnoDB”,然后重启数据库即可:
[mysqld]
...省略N行,爱E族 aiezu.com ...
default-storage-engine=InnoDB
 
2、修改已有数据表的存储引擎:
  要将已有的数据表,修改为使用“InnoDB”作为默认存储引擎,通过“alter table”命令:
低版本:
mysql> alter table test type=INNODB;
Query OK, 0 rows affected, 1 warning (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
高版本:
MariaDB [aiezu]> alter table test ENGINE=INNODB;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
 
四、测试MySQL事务处理:
  MySQL使用BEGIN(或START TRANSACTION)、COMMIT、ROLLBACK三命令分别代表开始一个事务、提交事务、回滚事务,事务简单的流程如下:
--回滚的事务
BEGIN;
-- 事务要执行的操作,update、delete等..
ROLLBACK;

--提交的事务
BEGIN;
-- 事务要执行的操作,update、delete等..
COMMIT;

 事务的简单例子:
MariaDB [aiezu]> truncate table test;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> BEGIN;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> insert test(name,url) values('天猫','tmall.com');
Query OK, 1 row affected (0.00 sec)

MariaDB [aiezu]> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> insert test(name,url) values('爱E族','aiezu.com');
Query OK, 1 row affected (0.01 sec)

MariaDB [aiezu]> select * from test;
+----+---------+-----------+
| id | name | url |
+----+---------+-----------+
| 2 | 爱E族 | aiezu.com |
+----+---------+-----------+
1 row in set (0.00 sec)
  上面可以看出,插入的站点“天猫”,由于在事务里,事务被回滚,所以插入被撤销。但是它的“id:1”已经被其占用,所以后面成功插入的站点“爱E族”使用的ID是“2”。
 
五、常见错误:
错误一:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'type=innodb' at line 1
解决方法:
  这个错误是当前MySQL版本不支持type方式设置存储引擎的,将type关键词改成ENGINE 即可。
alter table test type=INNODB; --低版本
alter table test ENGINE=INNODB; --高版本

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)

Mysqlllslx520 发表了文章 • 0 个评论 • 5731 次浏览 • 2016-11-04 16:50 • 来自相关话题

  有时候,当我们使用“mysql”、“mysqladmin”、“mysqldump”等命令管理数据库时,服务器抛出类似如下错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)这个错误是由于什么原因导致的呢?请看后面爱E族(aiezu.com)为您提供的分析。 一、错误现场还原:下面我们通过三种方式来连接,然后观察提示的错误信息:1、直接使用“mysql”命令,不带主机名参数;2、使用带了主机名“localhost”参数的“mysql -h localhost”命令;3、使用带了主机名“127.0.0.1”参数的“mysql -h 127.0.0.1”命令。[root@aiezu.com ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h localhost
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h 127.0.0.1
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)  通过上面实验可以看出,前面两种方式都能产生标题中的错误,而第三种方式连接是不会产生标题中的错误的(第三种方式这里产生的是由于密码问题拒绝访问的错误信息)(爱E族)。 二、错误产生原因解析:   这是由于我们连接数据库使用的主机名参数为“localhost”,或者未使用主机名参数、服务器默认使用“localhost”做为主机名(爱E族)。 使用主机名参数为“localhost”连接mysql服务端时,mysql客户端会认为是连接本机,所以会尝试以socket文件方式进行连接(socket文件连接方式,比“ip:端口”方式效率更高),这时根据配置文件“/etc/my.cnf”的路径,未找到相应的socket文件,就会引发此错误。
   三、修复故障前准备:1、看mysql服务是否在运行:  由于“socket”文件是由mysql服务运行时创建的,如果提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”,找不到“socket”文件,我们首先要确认的是mysql服务是否正在运行。# 1、 端口是否打开
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 12207 mysql 14u IPv4 52350 0t0 TCP *:mysql (LISTEN)

# 2、mysqld服务是否正在运行
[root@aiezu.com ~]# service mysqld status
mysqld (pid 4717) is running...

# 3、如果mariadb,同样方法查服务是否正在运行:
[root@aiezu.com ~]# service mariadb status
Redirecting to /bin/systemctl status mariadb.service
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2016-11-03 13:47:37 CST; 23min ago  2、确定“socket”文件正确位置:  确定mysql服务正常运行后,产生此错误的原因只剩下“socket”文件路径不正确了,我们可以使用“find”命令或者“lsof”命令来确定socket文件的正确路径:[root@aiezu.com ~]# lsof -c mysqld|grep sock$
mysqld 4717 mysql 12u unix 0xffff88010a655b80 0t0 77474827 /storage/db/mysql/mysql.sock

[root@aiezu.com ~]# find / -name '*.sock'
/storage/db/mysql/mysql.sock 四、故障解决方法:解决方案一:  修改“/etc/my.cnf”配置文件,在配置文件中添加“[client]”选项和“[mysql]”选项,并使用这两个选项下的“socket”参数值,与“[mysqld]”选项下的“socket”参数值,指向的socket文件路径完全一致。如下: [mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
...省略n行(爱E族)...

[client]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock

[mysql]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock修改完后,重启mysqld服务,即可解决此问题。
 解决方案二:  使用“ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock”命令,将正确的socket文件位置,软链接到提示错误的socket文件路径位置,即可解决此问题:[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
ls: cannot access /var/lib/mysql/mysql.sock: No such file or directory
[root@aiezu.com ~]# ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sock   五、后序:  这篇文章只讲述了mysql提供的“mysql”、“mysqldump”、“mysqladmin”等命令提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”的解决方法,如果需要解决“php”、“perl”、“python”等脚本语言提示此错误的问题,请参考爱E族的另外一篇文章:http://aiezu.com/article/mysql_php_connect_through_socket.html 查看全部
  有时候,当我们使用“mysql”、“mysqladmin”、“mysqldump”等命令管理数据库时,服务器抛出类似如下错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
这个错误是由于什么原因导致的呢?请看后面爱E族(aiezu.com)为您提供的分析。

 

一、错误现场还原:

下面我们通过三种方式来连接,然后观察提示的错误信息:
  • 1、直接使用“mysql”命令,不带主机名参数;
  • 2、使用带了主机名“localhost”参数的“mysql -h localhost”命令;
  • 3、使用带了主机名“127.0.0.1”参数的“mysql -h 127.0.0.1”命令。
[root@aiezu.com ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h localhost
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h 127.0.0.1
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
  通过上面实验可以看出,前面两种方式都能产生标题中的错误,而第三种方式连接是不会产生标题中的错误的(第三种方式这里产生的是由于密码问题拒绝访问的错误信息)(爱E族)。

 

二、错误产生原因解析:

   这是由于我们连接数据库使用的主机名参数为“localhost”,或者未使用主机名参数、服务器默认使用“localhost”做为主机名(爱E族)。 使用主机名参数为“localhost”连接mysql服务端时,mysql客户端会认为是连接本机,所以会尝试以socket文件方式进行连接(socket文件连接方式,比“ip:端口”方式效率更高),这时根据配置文件“/etc/my.cnf”的路径,未找到相应的socket文件,就会引发此错误。
   

三、修复故障前准备:

1、看mysql服务是否在运行:

  由于“socket”文件是由mysql服务运行时创建的,如果提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”,找不到“socket”文件,我们首先要确认的是mysql服务是否正在运行。
# 1、 端口是否打开
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 12207 mysql 14u IPv4 52350 0t0 TCP *:mysql (LISTEN)

# 2、mysqld服务是否正在运行
[root@aiezu.com ~]# service mysqld status
mysqld (pid 4717) is running...

# 3、如果mariadb,同样方法查服务是否正在运行:
[root@aiezu.com ~]# service mariadb status
Redirecting to /bin/systemctl status mariadb.service
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2016-11-03 13:47:37 CST; 23min ago
  

2、确定“socket”文件正确位置:

  确定mysql服务正常运行后,产生此错误的原因只剩下“socket”文件路径不正确了,我们可以使用“find”命令或者“lsof”命令来确定socket文件的正确路径:
[root@aiezu.com ~]# lsof  -c mysqld|grep sock$
mysqld 4717 mysql 12u unix 0xffff88010a655b80 0t0 77474827 /storage/db/mysql/mysql.sock

[root@aiezu.com ~]# find / -name '*.sock'
/storage/db/mysql/mysql.sock
 

四、故障解决方法:

解决方案一:

  修改“/etc/my.cnf”配置文件,在配置文件中添加“[client]”选项和“[mysql]”选项,并使用这两个选项下的“socket”参数值,与“[mysqld]”选项下的“socket”参数值,指向的socket文件路径完全一致。如下: 
[mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
...省略n行(爱E族)...

[client]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock

[mysql]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock
修改完后,重启mysqld服务,即可解决此问题。
 

解决方案二:

  使用“ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock”命令,将正确的socket文件位置,软链接到提示错误的socket文件路径位置,即可解决此问题:
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
ls: cannot access /var/lib/mysql/mysql.sock: No such file or directory
[root@aiezu.com ~]# ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sock

  

 五、后序:

  这篇文章只讲述了mysql提供的“mysql”、“mysqldump”、“mysqladmin”等命令提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”的解决方法,如果需要解决“php”、“perl”、“python”等脚本语言提示此错误的问题,请参考爱E族的另外一篇文章:http://aiezu.com/article/mysql_php_connect_through_socket.html

Mysql数据库中计算两GPS坐标的距离

Mysqlliuliangsong 发表了文章 • 0 个评论 • 199 次浏览 • 2016-10-19 13:12 • 来自相关话题

Mysql数据库中计算两GPS坐标的距离有两种方式:
1、直接使用SQL语句:#lat为纬度, lng为经度, 一定不要弄错
declare @lng1 float;
declare @lat1 float;
declare @lng2 float;
declare @lat2 float;
set @lng1=116.3899;
set @lat1=39.91578;
set @lng2=116.3904;
set @lat2=39.91576;
select (2*ATAN2(SQRT(SIN((@lat1-@lat2)*PI()/180/2)
*SIN((@lat1-@lat2)*PI()/180/2)+
COS(@lat2*PI()/180)*COS(@lat1*PI()/180)
*SIN((@lng1-@lng2)*PI()/180/2)
*SIN((@lng1-@lng2)*PI()/180/2)),
SQRT(1-SIN((@lat1-@lat2)*PI()/180/2)
*SIN((@lat1-@lat2)*PI()/180/2)
+COS(@lat2*PI()/180)*COS(@lat1*PI()/180)
*SIN((@lng1-@lng2)*PI()/180/2)
*SIN((@lng1-@lng2)*PI()/180/2))))*6378140;
#返回结果: 42.7484246368099
2、定义函数后再调用(适合批量计算):# use aiezu;
drop function getDistance;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `getDistance`(
lng1 float(10,7)
,lat1 float(10,7)
,lng2 float(10,7)
,lat2 float(10,7)
) RETURNS double
begin
declare d double;
declare radius int;
set radius = 6378140; #假设地球为正球形,直径为6378140米
set d = (2*ATAN2(SQRT(SIN((lat1-lat2)*PI()/180/2)
*SIN((lat1-lat2)*PI()/180/2)+
COS(lat2*PI()/180)*COS(lat1*PI()/180)
*SIN((lng1-lng2)*PI()/180/2)
*SIN((lng1-lng2)*PI()/180/2)),
SQRT(1-SIN((lat1-lat2)*PI()/180/2)
*SIN((lat1-lat2)*PI()/180/2)
+COS(lat2*PI()/180)*COS(lat1*PI()/180)
*SIN((lng1-lng2)*PI()/180/2)
*SIN((lng1-lng2)*PI()/180/2))))*radius;
return d;
end
$$
DELIMITER ;
select getDistance(116.3899,39.91578,116.3904,39.91576); #调用函数
#返回结果:43.045058294389 
常见问题及解决方法:
常见问题:
  在创建函数前报如下错误:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)解决方法:
  在创建函数前执行下面SQL语句:set global log_bin_trust_function_creators=1;或者修改my.cnf文件并重启mysqld服务:log_bin_trust_function_creators=1
PHP计算两个GPS坐标点之间的距离: http://aiezu.com/article/18.html
Javascript计算两个GPS坐标的距离: http://aiezu.com/article/17.html
 
更多关于GPS计算请参考:http://www.movable-type.co.uk/scripts/latlong.html(被墙) 查看全部
Mysql数据库中计算两GPS坐标的距离有两种方式:
1、直接使用SQL语句:
#lat为纬度, lng为经度, 一定不要弄错
declare @lng1 float;
declare @lat1 float;
declare @lng2 float;
declare @lat2 float;
set @lng1=116.3899;
set @lat1=39.91578;
set @lng2=116.3904;
set @lat2=39.91576;
select (2*ATAN2(SQRT(SIN((@lat1-@lat2)*PI()/180/2)
*SIN((@lat1-@lat2)*PI()/180/2)+
COS(@lat2*PI()/180)*COS(@lat1*PI()/180)
*SIN((@lng1-@lng2)*PI()/180/2)
*SIN((@lng1-@lng2)*PI()/180/2)),
SQRT(1-SIN((@lat1-@lat2)*PI()/180/2)
*SIN((@lat1-@lat2)*PI()/180/2)
+COS(@lat2*PI()/180)*COS(@lat1*PI()/180)
*SIN((@lng1-@lng2)*PI()/180/2)
*SIN((@lng1-@lng2)*PI()/180/2))))*6378140;
#返回结果: 42.7484246368099

2、定义函数后再调用(适合批量计算):
# use aiezu;
drop function getDistance;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `getDistance`(
lng1 float(10,7)
,lat1 float(10,7)
,lng2 float(10,7)
,lat2 float(10,7)
) RETURNS double
begin
declare d double;
declare radius int;
set radius = 6378140; #假设地球为正球形,直径为6378140米
set d = (2*ATAN2(SQRT(SIN((lat1-lat2)*PI()/180/2)
*SIN((lat1-lat2)*PI()/180/2)+
COS(lat2*PI()/180)*COS(lat1*PI()/180)
*SIN((lng1-lng2)*PI()/180/2)
*SIN((lng1-lng2)*PI()/180/2)),
SQRT(1-SIN((lat1-lat2)*PI()/180/2)
*SIN((lat1-lat2)*PI()/180/2)
+COS(lat2*PI()/180)*COS(lat1*PI()/180)
*SIN((lng1-lng2)*PI()/180/2)
*SIN((lng1-lng2)*PI()/180/2))))*radius;
return d;
end
$$
DELIMITER ;
select getDistance(116.3899,39.91578,116.3904,39.91576); #调用函数
#返回结果:43.045058294389
 
常见问题及解决方法:
常见问题:
  在创建函数前报如下错误:
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
解决方法:
  在创建函数前执行下面SQL语句:
set global log_bin_trust_function_creators=1;
或者修改my.cnf文件并重启mysqld服务:
log_bin_trust_function_creators=1

PHP计算两个GPS坐标点之间的距离: http://aiezu.com/article/18.html
Javascript计算两个GPS坐标的距离: http://aiezu.com/article/17.html
 
更多关于GPS计算请参考:http://www.movable-type.co.uk/scripts/latlong.html(被墙)

连接Mysql提示Can’t connect to local MySQL server through socket的解决方法

Mysqlliuliangsong 发表了文章 • 0 个评论 • 482 次浏览 • 2016-10-19 11:35 • 来自相关话题

mysql、mysqldump、mysqladmin、php连接mysql服务常会提示下面错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)   这是由于当使用host参数为“localhost”连接Mysql服务时,会优先使用“sock文件”进行连接,而不是使用“IP:端口”进行连接,而mysql尝试使用“sock文件”进行连接时,却无法获取“sock文件”的位置。
 
要解决此错误,有两种解决方法:将连接参数“host”的值由“localhost”改成“127.0.0.1”;按下面方法,在“/etc/mysql.cnf”中指定“sock文件”位置。 一、查看mysql服务的socket文件位置:  mysql socket文件的位置是在/etc/my.cnf中设置的,cat /etc/my.cnf内容如下:[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock
user=mysql  其中socket等于的路径就是socket文件的位置,我们只要修改my.cnf文件,告诉mysql,mysqldump,mysqladmin等mysql服务的socket位置在哪里就可以了,文件中可以看出,我的socket文件位置为:"/storage/aiezu.com/mysql/mysql.sock"。
 二、修改my.cnf文件解决问题:  在/etc/my.cnf文件中添加如下内容,并重启mysqld服务,即可解决mysql、mysqldump、mysqladmin的“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'”问题:[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

[mysql]
socket=/storage/aiezu.com/mysql/mysql.sock

[client]
socket=/storage/aiezu.com/mysql/mysql.sock

[mysqldump]
socket=/storage/aiezu.com/mysql/mysql.sock

[mysqladmin]
socket=/storage/aiezu.com/mysql/mysql.sock 三、php连接mysql服务提示"Can't connect to local MySQL server through socket..."的解决方法:  有时候mysql服务正常运行,用户名密码也完全正确,使用php的mysql_connect函数却连接不了mysql,调用php的mysql_error()函数提示“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'”,这是我们需要修改/etc/php.ini文件。
  在/etc/php.ini文件中"[MySQL]"项下找到"mysql.default_socket",并设置其值指向正确的mysql服务socket文件即可,如:[MySQL]
...省略n行...
mysql.default_socket = "/storage/aiezu.com/mysql/mysql.sock" 四、python连接mysql提示"Can't connect to local MySQL server through socket..."的解决方法:  在连接mysql数据库函数中指定socket文件,如下:#!/usr/bin/python
from MySQLdb import connect
conn = connect(db="pzy", user="root", host="localhost", unix_socket="/storage/aiezu.com/mysql/mysql.sock")
cur = conn.cursor()
count=cur.execute("show databases")
print 'there has %s dbs' % count
conn.commit()
conn.close() 五、 php pdo连接mysql提示"Can't connect to local MySQL server through socket..."的解决方法:  同样在连接字符串添加mysql socket文件的位置即可,如下:<?php
$dsn = "mysql:host=localhost;dbname=pzy;unix_socket=/storage/aiezu.com/mysql/mysql.sock";
$db = new PDO($dsn, 'root', '');
$rs = $db->query("SELECT * FROM qrtest");
while($row = $rs->fetch()){
print_r($row);
}
?> 
六、相关页面:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2) 查看全部
mysql、mysqldump、mysqladmin、php连接mysql服务常会提示下面错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
   这是由于当使用host参数为“localhost”连接Mysql服务时,会优先使用“sock文件”进行连接,而不是使用“IP:端口”进行连接,而mysql尝试使用“sock文件”进行连接时,却无法获取“sock文件”的位置。
 
要解决此错误,有两种解决方法:
  • 将连接参数“host”的值由“localhost”改成“127.0.0.1”;
  • 按下面方法,在“/etc/mysql.cnf”中指定“sock文件”位置。
 

一、查看mysql服务的socket文件位置:

  mysql socket文件的位置是在/etc/my.cnf中设置的,cat /etc/my.cnf内容如下:
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock
user=mysql
  其中socket等于的路径就是socket文件的位置,我们只要修改my.cnf文件,告诉mysql,mysqldump,mysqladmin等mysql服务的socket位置在哪里就可以了,文件中可以看出,我的socket文件位置为:"/storage/aiezu.com/mysql/mysql.sock"。
 

二、修改my.cnf文件解决问题:

  在/etc/my.cnf文件中添加如下内容,并重启mysqld服务,即可解决mysql、mysqldump、mysqladmin的“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'”问题:
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

[mysql]
socket=/storage/aiezu.com/mysql/mysql.sock

[client]
socket=/storage/aiezu.com/mysql/mysql.sock

[mysqldump]
socket=/storage/aiezu.com/mysql/mysql.sock

[mysqladmin]
socket=/storage/aiezu.com/mysql/mysql.sock

 

三、php连接mysql服务提示"Can't connect to local MySQL server through socket..."的解决方法:

  有时候mysql服务正常运行,用户名密码也完全正确,使用php的mysql_connect函数却连接不了mysql,调用php的mysql_error()函数提示“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'”,这是我们需要修改/etc/php.ini文件。
  在/etc/php.ini文件中"[MySQL]"项下找到"mysql.default_socket",并设置其值指向正确的mysql服务socket文件即可,如:
[MySQL]
...省略n行...
mysql.default_socket = "/storage/aiezu.com/mysql/mysql.sock"
 

四、python连接mysql提示"Can't connect to local MySQL server through socket..."的解决方法:

  在连接mysql数据库函数中指定socket文件,如下:
#!/usr/bin/python
from MySQLdb import connect
conn = connect(db="pzy", user="root", host="localhost", unix_socket="/storage/aiezu.com/mysql/mysql.sock")
cur = conn.cursor()
count=cur.execute("show databases")
print 'there has %s dbs' % count
conn.commit()
conn.close()
 

五、 php pdo连接mysql提示"Can't connect to local MySQL server through socket..."的解决方法:

  同样在连接字符串添加mysql socket文件的位置即可,如下:
<?php
$dsn = "mysql:host=localhost;dbname=pzy;unix_socket=/storage/aiezu.com/mysql/mysql.sock";
$db = new PDO($dsn, 'root', '');
$rs = $db->query("SELECT * FROM qrtest");
while($row = $rs->fetch()){
print_r($row);
}
?>
 
六、相关页面:

Mysql错误Too many connections的解决方法

Mysqllinyu520 发表了文章 • 0 个评论 • 101 次浏览 • 2016-10-17 17:21 • 来自相关话题

  连接mysql时报too many connections错误,是因为同时打开连接太多、超过设置文件限制所致。通过show processlist你会发现有很多sleep连接,这是因为使用了长连接(mysql_pconnect)或者短连接(mysql_connect)未正常关闭导致的。

  这时你需要检查程序代码,看是否有未正常关闭mysql连接,同时优化执行过慢的SQL语句。确定程序没问题时,修改mysql配置文件,加大mysqld的最大连接数,同时设置一个短的超时时间,让短连接尽快的自动关闭即可解决次问题:

修改/etc/my.cnf,添加下面内容,并重启mysqld服务即可:max_connections = 500 #由默认的150改成500个连接
wait_timeout=600 #由默认的2880改为600秒
interactive_timeout = 600 #由默认的2880改为600秒当然,加大连接数需要谨慎,设置够大,当同时打开的连接数太多时,有可能导致服务器内存不够而当机。
  查看全部
  连接mysql时报too many connections错误,是因为同时打开连接太多、超过设置文件限制所致。通过show processlist你会发现有很多sleep连接,这是因为使用了长连接(mysql_pconnect)或者短连接(mysql_connect)未正常关闭导致的。

  这时你需要检查程序代码,看是否有未正常关闭mysql连接,同时优化执行过慢的SQL语句。确定程序没问题时,修改mysql配置文件,加大mysqld的最大连接数,同时设置一个短的超时时间,让短连接尽快的自动关闭即可解决次问题:

修改/etc/my.cnf,添加下面内容,并重启mysqld服务即可:
max_connections = 500 #由默认的150改成500个连接
wait_timeout=600 #由默认的2880改为600秒
interactive_timeout = 600 #由默认的2880改为600秒
当然,加大连接数需要谨慎,设置够大,当同时打开的连接数太多时,有可能导致服务器内存不够而当机。