最近公司搞个项目迁移,迁移到巴西圣保罗,为此购买了亚马逊在南美的云产品。其实用惯了阿里云,再用亚马逊云实在不习惯,它没有提供很多便利性。不过在反复折腾亚马逊RDS FOR MYSQL 8.0 实列,感觉没有费用提示。
唯独遗憾的时候 参数修改跟数据库非直连的,且有众多的限制,使用起来非常不太方便,比如说修改只读变量,需要搞个参数组,然后参数组需要解除绑定RDS,才能修改。修改完后再跟RDS绑定起来。
Welcome to the MariaDB monitor. Commands end with ; or \g.Your MySQL connection id is 250Server version: 8.0.32 Source distribution
居然是迈蕾DB分支,默认开启了SSL认证
| have_openssl | YES || have_ssl | YES |
难坏我的小C程序,报链接失败
Mysql Connect Failed!
不过我的 脚本却能登陆,这就奇怪了!
mysql -h xxxxx -u love -p -D -A
为此增加打印 链接报错的信息 mysql_error()函数
if (mysql_real_connect(&my_connection,pHost,pUser,pPassword,pSchema,atoi(sParameter.port),NULL,CLIENT_FOUND_ROWS))
{
WriteLog(fpLogFileHandle, "Mysql Connect succent!");
connect_flag = 1;
}
else
{
WriteLog(fpLogFileHandle, "Mysql Connect Failed!");
connect_flag = 0;
const char* error = mysql_error(&my_connection);
printf("Connect Error:%s\n",error);
mysql_close(&my_connection);
fclose(fpFileHandle);
fclose(fpLogFileHandle);
}
报错信息:
SSL connection error: unknown error number
原来是SSL 认证。 我一直来比较讨厌SSL 它比较复杂,时间久了容易忘记,而且要配置多个选项,还涉及协议版本,另外什么各种钥匙,每种要还需要密码,另外什么证书之类的,再还有过期时间,到期了还需要更换认证!
以前也整了几次,现在脑子也是浆糊一片!
据说可以关闭,大部分是说关闭服务器,呃,这个不太好吧。
有的是说 跳过SSL,这个可以
mysql -h10.233.117.225 -P3306 -uroot -p --ssl-mode=DISABLED参数–ssl-mode取值官方文档:https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-modeDISABLED 与参数skip-ssl一样,不使用SSL/TLS建立加密连接PREFERRED 优先尝试使用SSL/TLS建立加密连接,如果无法建立则尝试建立非SSL/TLS连接REQUIRED 只会尝试使用SSL/TLS建立加密连接VERIFY_CA 与REQUIRED行为一样,与此同时会验证server端的证书是否有效VERIFY_IDENTITY 与VERIFY_CA行为一样,与此同时验证server端证书的host是否与实际连接的hostname一致
那我的脚本怎么能登录的呢?原来 用户根目录下有个隐藏的目录.ssh
使用ls -a 显示
测试下 脚本关闭SSL_MODE如何?
[zengfankun@db-jump-aws=>~]$mysql -h database-1.rds.amazonaws.com -P 3306 -u lts -p --ssl-mode=DISABLED -D lts -Amysql: unknown variable 'ssl-mode=DISABLED'
迈蕾妹子居然不支持,什么鬼?对比下mysql --help
--ssl Enable SSL for connection (automatically enabled withother flags).--ssl-ca=name CA file in PEM format (check OpenSSL docs, implies--ssl).--ssl-capath=name CA directory (check OpenSSL docs, implies --ssl).--ssl-cert=name X509 cert in PEM format (implies --ssl).--ssl-cipher=name SSL cipher to use (implies --ssl).--ssl-key=name X509 key in PEM format (implies --ssl).--ssl-verify-server-certVerify server's "Common Name" in its cert againsthostname used when connecting. This option is disabled bydefault.
mysql5.7和percona8.0.20 都有SSL-MODE
--ssl-mode=name SSL connection mode.--ssl-ca=name CA file in PEM format.--ssl-capath=name CA directory.--ssl-cert=name X509 cert in PEM format.--ssl-cipher=name SSL cipher to use.--ssl-key=name X509 key in PEM format.--ssl-crl=name Certificate revocation list.--ssl-crlpath=name Certificate revocation list path.--tls-version=name TLS version to use, permitted values are: TLSv1, TLSv1.1,TLSv1.2, TLSv1.3--ssl-fips-mode=nameSSL FIPS mode (applies only for OpenSSL); permittedvalues are: OFF, ON, STRICT--tls-ciphersuites=nameTLS v1.3 cipher to use.
那个--ssl 试试看
[zengfankun@db-jump-aws=>~]$mysql -h database-1.rds.amazonaws.com -P 3306 -u lts -pshark^Brazil3 --ssl=off -D lts -AWelcome to the MariaDB monitor. Commands end with ; or \g.Your MySQL connection id is 250Server version: 8.0.32 Source distributionCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [lts]>
回到我们的小C里
官网相关函数
https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html
mysql_options() 要在初始后,链接前设置
怎么设置呢?
mysql_options(&my_connection,MYSQL_OPT_SSL_MODE,&i);
分支的分歧在于i 迈蕾果真是女孩子家,小气的狠!
不能直接给 SSL_MODE_DISABLED 否则运行报段地址错误
也不能直接给 1,2,3 否则告诉你链接失败,
需要定义个变量,然后给变量传数字 比如 i=0;
这里迈蕾要使用1
if (sParameter.TOTAL_SQL[0] != '\0')
{
MYSQL my_connection;
int connect_flag = 0;
mysql_init(&my_connection); //初始化链接
char* pHost;
char* pUser;
char* pPassword;
char* pSchema;
pHost=sParameter.ip;
pUser=sParameter.user;
pPassword=sParameter.passwd;
pSchema = sParameter.schema;
unsigned int i = 1; //SSL_MODE_DISABLED,SSL_MODE_PREFERRED, SSL_MODE_REQUIRED, SSL_MODE_VERIFY_CA,SSL_MODE_VERIFY_IDENTITY
mysql_options(&my_connection,MYSQL_OPT_SSL_MODE,&i);
if (mysql_real_connect(&my_connection,pHost,pUser,pPassword,pSchema,atoi(sParameter.port),NULL,CLIENT_FOUND_ROWS))
{
WriteLog(fpLogFileHandle, "Mysql Connect succent!");
connect_flag = 1;
}
else
{
WriteLog(fpLogFileHandle, "Mysql Connect Failed!");
connect_flag = 0;
const char* error = mysql_error(&my_connection);
printf("Connect Error:%s\n",error);
mysql_close(&my_connection);
fclose(fpFileHandle);
fclose(fpLogFileHandle);
}
2023-02-16 04:00:15.846. 54.428 ==> home/zengfankun/DelBigTableData/logs/DelBigTableLog.txt2023-02-16 04:00:15.846. 66.263 ==> Execute Dir:/home/zengfankun/DelBigTableData2023-02-16 04:00:15.846. 75.188 ==> App Dir:/home/zengfankun/DelBigTableData/2023-02-16 04:00:15.846. 83.905 ==> IP:192.168.2.2502023-02-16 04:00:15.846. 92.605 ==> user:lts2023-02-16 04:00:15.846.101.248 ==> port:33062023-02-16 04:00:15.846.114.997 ==> passwd:Love^BraziFover2023-02-16 04:00:15.846.126. 80 ==> schema:lts2023-02-16 04:00:15.846.134.992 ==> TOTAL_SQL:SELECT COUNT(*) as ALLROWS FROM lts.lts_job_log_po WHERE gmt_created< UNIX_TIMESTAMP(date_add(now(), interval -30 day)) *10002023-02-16 04:00:15.846.145.690 ==> limit_rows:10002023-02-16 04:00:15.846.154.543 ==> DEL_SQL:DELETE FROM lts.lts_job_log_po WHERE gmt_created< UNIX_TIMESTAMP(date_add(now(), interval -30 day)) *10002023-02-16 04:00:15.847.551.359 ==> Mysql Connect succent!2023-02-16 04:00:15.850.574.881 ==> GetTotal Rows is Zero!





