连接数据库是一个很容易出错,出错后因为原因众多又难以定位的一个bug.
1. 检查数据库连接配置
1.1. 密码什么的错误吗?
1.2. 确认用户权限
- 创建用户时需要这样:
第一个itoffice表示用户名,%表示所有的电脑都可以连接,也可以设置某个ip地址运行连接(这样安全些),第二个itoffice表示密码[^用户权限]:
[^用户权限]
2. 检查是否创建成功
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
或者这样检查
1.3. 使用com.mysql.jdbc.Driver
时
或者简单点说就是你的url咋写的
jdbc:mysql://127.0.0.1:3306/ --username hive --password hive
jdbc:mysql://127.0.0.1:3306/hive?characterEncoding=utf-8 --username hive --password hive
注意第二种
1.4. 使用com.mysql.cj.jdbc.Driver
貌似还需要指定时区那些,暂略
2. 测试本地连接
简单用一下jdbc测试本地连接1
3. 各版本对应关系
3.1. mysql-connector-java与Mysql对应版本
mysql>select version()
可以查看数据库版本.
3.2. mysql-connector-java与Java对应版本
3.3. openSSL
- 5.x版本
注意useSSL=false必须为false
- 8.x版本
4. 排查是否线程超时
4.1. Mysql服务器默认的“wait_timeout”是8小时
mysql﹥ show global variables like 'wait_timeout';
可以查看到,这意味着如果一个connection
空闲超过8个小时,Mysql将自动断开该connection。
4.2. 重置wait_timeout
或者直接修改my.ini
(windows下),my.cnf
(linux下)
5. 防火墙是否关闭
**默认是关闭的.**但是依然有可能屏蔽3306端口.
-
设置防火墙允许3306端口
vi /etc/sysconfig/IPtables
-
添加(添加在
-A RH-Firewall-1-INPUT -j REJECT –reject-with icmp-host-prohibited
之前)-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-
重启防火墙
service iptables restart
6. Mysql默认跟随Ubuntu等使用的验证插件有问题
以至于在root@%
的情况下能使用localhost
登录,不能使用127.0.0.1
登录,并在修改user表至下图后:
造成下面Error 1698 和 Error 1045同框:
最终只能卸载Mysql,重新解决1698的问题.并注意重新设置验证插件后,没有密码,需重新指定密码.
7. 其他
error2003,可以限制只监听3306端口,但是放开所有IP
update-alternatives: 使用 /etc/mysql/my.cnf.fallback 来在自动模式中提供 /etc/mysql/my.cnf (my.cnf)