AliSQL20171010版本釋出Sequence相容PostgreSQL/Oracle語法和升級TLSv1.2

xpchild發表於2017-10-10

Abstract

為了增加Sequence使用的靈活性,以及方便從不同資料庫進行遷移,AliSQL增加了Sequence的相容性,相容了PostgreSQL和Oracle的Sequence語法。

為了保障資料傳輸安全,AliSQL使用OpenSSL來代替社群版的yaSSL,並把預設的,已經被PCI DSS v3.1標準廢棄的TLSv1.0升級到TLSv1.2版本。

並修復了一個Semisync的未合理處理訊號的bug,
感謝 boonie81 提交的bug issue#68

AliSQL REPO: https://github.com/alibaba/AliSQL
AliSQL Release Notes: https://github.com/alibaba/AliSQL/wiki/Changes-in-AliSQL-5.6.32-(2017-10-10)

1. Sequence相容PostgreSQL和Oracle使用語法

概要

為了增加sequence使用的使用者體驗,以及滿足使用者的使用習慣,Sequence新增了使用語法支援:

Sequence建立語法保持不變:

CREATE SEQUENCE [IF NOT EXISTS] schema.seqName
   [START WITH <constant>]
   [MINVALUE <constant>]
   [MAXVALUE <constant>]
   [INCREMENT BY <constant>]
   [CACHE <constant> | NOCACHE]
   [CYCLE | NOCYCLE]
  ;

SHOW syntax:
  SHOW CREATE SEQUENCE schema.seqName;
  SHOW CREATE TABLE schema.seqName;

除了原有支援的查詢方法:

 SELECT [nextval | currval | *] FOR schema.seqName;
 SELECT [nextval | currval | *] FROM schema.seqName;

新增了函式和dual表方法:

 SELECT nextval(seqName);  
 SELECT currval(seqName);

 SELECT seqName.nextval from dual;
 SELECT seqName.currval from dual;

2. 升級TLSv1.2

概要

原有的官方社群版 MySQL 只支援到 TLSv1.0 版本,但 TLSv1.0 已經證明是非安全的,存在漏洞,並已經被 PCI DSS v3.1 標準廢棄了,考慮到社群的yaSSL只能最高支援TLSv1.1版本, 並且方便部署,減少依賴,AliSQL直接靜態編譯了OpenSSL,提供TLSv1.2版本。 新增了編譯方式和引數:

新增支援cmake編譯引數:
-DWITH_SSL=openssl 即靜態編譯openSSL。

新增引數tls_version:
如果使用yaSSL編譯:tls_version的預設值是:TLSv1,TLSv1.1
如果使用OpenSSL編譯:tls_version的預設值是:TLSv1,TLSv1.1,TLSv1.2

例如:使用OpenSSL編譯的AliSQL:

Type `help;` or `h` for help. Type `c` to clear the current input statement.

mysql> show global variables like `%tls_%`;
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| have_tlsv1_2  | YES                   |
| tls_version   | TLSv1,TLSv1.1,TLSv1.2 |
+---------------+-----------------------+
2 rows in set (0.00 sec)

配置證照進行連線來檢視當前連線的tls版本:

mysql> show global variables like `%ssl%`;
+---------------+--------------------------------------------+
| Variable_name | Value                                      |
+---------------+--------------------------------------------+
| have_openssl  | YES                                        |
| have_ssl      | YES                                        |
| ssl_ca        | /u01/ca.pem                                |
| ssl_capath    |                                            |
| ssl_cert      | /u01/server-cert.pem                       |
| ssl_cipher    |                                            |
| ssl_crl       |                                            |
| ssl_crlpath   |                                            |
| ssl_key       | /u01/server-key.pem                        |
+---------------+--------------------------------------------+

使用ca證照進行連線:
mysql -h127.0.0.1 -ussl_user –ssl-ca=/u01/ca.pem –ssl-cert=/u01/client-cert.pem –ssl-key=/u01/client-key.pem

Type `help;` or `h` for help. Type `c` to clear the current input statement.

mysql> s
--------------
mysql  Ver 14.14 Distrib 5.6.32, for Linux (x86_64) using  EditLine wrapper

Connection id:          4
Current database:
Current user:           ssl_user@127.0.0.1
SSL:                    Cipher in use is DHE-RSA-AES128-GCM-SHA256
Current pager:          stdout
Using outfile:          ``
Using delimiter:        ;
Server version:         5.6.32 Source distribution
Protocol version:       10
Connection:             127.0.0.1 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3306 
Uptime:                 1 hour 35 min 31 sec

Threads: 1  Questions: 16  Slow queries: 0  Opens: 70  Flush tables: 1  Open tables: 63  Queries per second avg: 0.002
--------------


mysql> show status like `ssl_version`;
+---------------+---------+
| Variable_name | Value   |
+---------------+---------+
| Ssl_version   | TLSv1.2 |
+---------------+---------+
1 row in set (0.00 sec)

為了使用TLSv1.2版本,也必須升級客戶端使用openSSL編譯,其相容性如下:

Compatibility

The TLS Protocol version matrix:
-----------------------------------------------------------------------
                    Pre_Server   Post_yaSSL_Server  Post_openSSL_Server
Pre_Client          TLSv1.0      TLSv1.0            TLSv1.0
Post_yaSSL_Client   TLSv1.0      TLSv1.1            TLSv1.1
Post_openSSL_Client TLSv1.0      TLSv1.1            TLSv1.2
-----------------------------------------------------------------------

3.Semisync的bug修復

概要

在系統啟動過程中,Semisync模組的ACK Receiver執行緒在系統遮蔽訊號之前boot,導致當有訊號的時候,
ACK Receiver 執行緒接收到了訊號,而不是專有訊號處理執行緒,導致不能正常的Shut down。

再次感謝Github社群的boonie81同學提交的bug report。


相關文章