暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

小C搞定亚马逊云RDS MYSQL8

671

最近公司搞个项目迁移,迁移到巴西圣保罗,为此购买了亚马逊在南美的云产品。其实用惯了阿里云,再用亚马逊云实在不习惯,它没有提供很多便利性。不过在反复折腾亚马逊RDS FOR MYSQL 8.0 实列,感觉没有费用提示。

唯独遗憾的时候 参数修改跟数据库非直连的,且有众多的限制,使用起来非常不太方便,比如说修改只读变量,需要搞个参数组,然后参数组需要解除绑定RDS,才能修改。修改完后再跟RDS绑定起来。

    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 250
    Server 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 它比较复杂,时间久了容易忘记,而且要配置多个选项,还涉及协议版本,另外什么各种钥匙,每种要还需要密码,另外什么证书之类的,再还有过期时间,到期了还需要更换认证!

          MYSQL-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-mode


            DISABLED 与参数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 -A
              mysql: unknown variable 'ssl-mode=DISABLED'

              迈蕾妹子居然不支持,什么鬼?对比下mysql --help

                  --ssl               Enable SSL for connection (automatically enabled with
                other 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-cert
                Verify server's "Common Name" in its cert against
                hostname used when connecting. This option is disabled by
                default.

                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=name
                  SSL FIPS mode (applies only for OpenSSL); permitted
                  values are: OFF, ON, STRICT
                  --tls-ciphersuites=name
                  TLS 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 -A
                    Welcome to the MariaDB monitor. Commands end with ; or \g.
                    Your MySQL connection id is 250
                    Server version: 8.0.32 Source distribution


                    Copyright (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.txt
                          2023-02-16 04:00:15.846. 66.263 ==> Execute Dir:/home/zengfankun/DelBigTableData
                          2023-02-16 04:00:15.846. 75.188 ==> App Dir:/home/zengfankun/DelBigTableData/
                          2023-02-16 04:00:15.84683.905   ==>   IP:192.168.2.250
                          2023-02-16 04:00:15.846. 92.605 ==> user:lts
                          2023-02-16 04:00:15.846.101.248 ==> port:3306
                          2023-02-16 04:00:15.846.114.997   ==>   passwd:Love^BraziFover
                          2023-02-16 04:00:15.846.126. 80 ==> schema:lts
                          2023-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)) *1000
                          2023-02-16 04:00:15.846.145.690 ==> limit_rows:1000
                          2023-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)) *1000
                          2023-02-16 04:00:15.847.551.359 ==> Mysql Connect succent!
                          2023-02-16 04:00:15.850.574.881 ==> GetTotal Rows is Zero!



                          解决时区的小C

                          C语言的野指针

                          用C去删除MYSQL日志表数据完善篇

                          C语言菜单



                          文章转载自海鲨数据库架构师,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论