開啟和驗證MySQL支持IPv6的方法,
此處使用的MySQL版本為mysql-5.5.35-linux2.6-x86_64。
1.驗證操作系統支持IPv6,此處是Linux操作系統
ping6 ::1
2.配置MySQL支持IPv6連接
在MySQL啟動時綁定地址,在服務啟動時使用如下參數--bind-address=addr配置,
其中addr可以是IPv4或者IPv6地址,或者主機名hostname。
修改my.cnf配置文件,在[mysqld]選項下增加bind-address = ::配置,
把bind-address配置成::可以保證同時支持IPv4和IPv6的TCP/IP的連接。
[mysqld]
bind-address = ::
重啟mysql使配置生效:
/etc/init.d/mysqld restart
3.創建測試用戶
使用IPv4先登陸mysql,
執行命令CREATE USER 'ipv6test'@'::1' IDENTIFIED BY '123456';
4.給ipv6test用戶增加執行權限
執行命令GRANT ALL PRIVILEGES ON . TO 'ipv6test'@'::1' IDENTIFIED BY '123456' WITH GRANT OPTION;
5.驗證通過::1本地連接mysql數據庫
輸入命令mysql -h ::1 -uipv6test -p123456
6.新增"root@%"就可任意ip訪問,注意%通配,
和IPv4時沒有區別,如果已經配置了"root@%"用戶,直接使用IPv6地址即可訪問。
grant all on . to root@'%' identified by 'zdh1234' with grant option;
mysql -h 2001:db8:1:0:20c:29ff:fe96:8b55 -uroot -pzdh1234
7.使用netstat查看3306端口:
netstat -an | grep 3306
0.0.0.0:3306
表示監聽端口綁定IPv4,只支持IPv4地址連接
:::3306
表示監聽端口綁定IPv4和IPv6,支持IPv4和IPv6地址連接
8.使用jdbc連接mysql的URL
// IPv4連接URL
String jdbcIpv4Url_1 = "jdbc:mysql://10.43.159.11:3306/databaseName";
String jdbcIpv4Url_2 = "jdbc:mysql://address=(protocol=tcp)(host=10.43.159.11)(port=3306)/databaseName";
// IPv6連接URL
String jdbcIpv6Url = "jdbc:mysql://address=(protocol=tcp)(host=2001:db8:1:0:20c:29ff:fe96:8b55)(port=3306)/database";
// hostname連接URL
String hostNmaeUrl_1 = "jdbc:mysql://zdh-11:3306/databaseName";
String hostNmaeUrl_2 = "jdbc:mysql://address=(protocol=tcp)(host=zdh-11)(port=3306)/databaseName";
注意使用IPv6地址時,必須使用address=(key=value)這種語法格式,
同時上面的主機名zhd-11可以對應IPv4地址也可以對應IPv6地址,
所以為了同時兼容IPv4,IPv6和hostname的情況,建議統一使用address=(key=value)這種語法格式連接MySQL。
注意下面的連接字符串可能過長:
address=(protocol=tcp)(host=2001:db8:1:0:20c:29ff:fe96:8b55)(port=3306)
會有如下報錯:
SQLException : SQL state: HY000 java.sql.SQLException: String 'address=(protocol=tcp)(host=2001:db8:1:0:20c:29ff:fe96:8b55)(port=3306' is too long for host name (should be no longer than 60) ErrorCode: 1470
可以使用簡寫版本,默認端口為3306:
address=(protocol=tcp)(host=2001:db8:1:0:20c:29ff:fe96:8b55),
或者把2001:db8:1:0:20c:29ff:fe96:8b55變為主機名hostname再填寫,
或者嘗試升級mysql版本提供更長的字符支持。
9.MySQL Connector 5.1和8.0版本的區別
使用MySQL Connector 5.1驅動,會發生步驟8中的問題;
使用MySQL Connector 8.0驅動, 對IPv6有了更好的支持,
可以使用如下格式語法避免問題:
jdbc:mysql://[2001:db8:1:0:20c:29ff:fe96:8b55]:3306/databaseName
jdbc:mysql://2001:db8:1:0:20c:29ff:fe96:8b55:3306/databaseName
jdbc:mysql://[2001:db8:1:0:20c:29ff:fe96:8b55]/databaseName
下面這種語法格式是會報錯的,不能使用:
jdbc:mysql://2001:db8:1:0:20c:29ff:fe96:8b55/databaseName
10.使用主機名hostname連接MySQL
使用root用戶添加IPv6地址對應的主機名映射
vi /etc/hosts
2001:db8:1:0:20c:29ff:fe96:8b55 zdh-11-IPv6
測試主機名能否ping通
ping6 zdh-11-IPv6
然后可以使用如下兩種格式連接MySQL:
jdbc:mysql://zdh-11-IPv6:3306/databaseName
jdbc:mysql://address=(protocol=tcp)(host=zdh-11-IPv6)(port=3306)/databaseName
另外提一下,主機名對應的如果是IPv4地址,
上面兩種格式也是通用的,如下:
10.43.159.11 zdh-11-IPv4
jdbc:mysql://zdh-11-IPv4:3306/databaseName
jdbc:mysql://address=(protocol=tcp)(host=zdh-11-IPv4)(port=3306)/databaseName
11.使用jdbc連接mysql的URL總結
11.1使用MySQL Connector 5.1驅動去連接MySQL
對應IPv4,IPv6和hostname都需要兼容的情況,推薦使用如下語法格式連接:
jdbc:mysql://address=(protocol=tcp)(host=10.43.159.11)(port=3306)/databaseName
jdbc:mysql://address=(protocol=tcp)(host=2001:db8:1:0:20c:29ff:fe96:8b55)(port=3306)/databaseName
jdbc:mysql://address=(protocol=tcp)(host=zdh-11)(port=3306)/databaseName
上面的主機名zhd-11可以對應IPv4地址也可以對應IPv6地址。
11.2 使用MySQL Connector 8.0驅動去連接MySQL
對應IPv4,IPv6和hostname都需要兼容的情況,推薦使用如下語法格式連接:
jdbc:mysql://10.43.159.11:3306/databaseName
jdbc:mysql://[2001:db8:1:0:20c:29ff:fe96:8b55]:3306/databaseName
jdbc:mysql://zdh-11:3306/databaseName
上面的主機名zhd-11可以對應IPv4地址也可以對應IPv6地址。
需要注意的是在8.0中address=(key=value)這種語法格式仍然是支持的。
12.參考文檔:
MySQL Connector/J 8.0 Download