All Secondary die, Primary hang? – SQL Server 2017 on Linux

关于AVAILABILITY_MODE

需要注意的是,与Oracle Data Guard不尽相同的概念是,在Always On AG中每个replica上都可以设置自己的AVAILABILITY_MODE。
AVAILABILITY_MODE参数有三个可选值,分别是SYNCHRONOUS_COMMIT、ASYNCHRONOUS_COMMIT和CONFIGURATION_ONLY。

  • SYNCHRONOUS_COMMIT:同步提交,意味着主replica的事务必须等到备replica将变更日志写入磁盘中才可以提交。可以设置包括主replica在内的最多三个replica处于同步提交状态。
  • ASYNCHRONOUS_COMMIT:异步提交,意味着replica无需等待备replica的动作而可以直接提交成功。
  • CONFIGURATION_ONLY:仅同步AG配置元数据。设置为该值的replica仅会从主replica中将AF配置的元数据同步过来,不会同步任何用户表数据。

在一个多节点replica的AG环境中,如果:

  • 主库和其中任何一个备库设置为SYNCHRONOUS_COMMIT,则主库的日志提交必须等待该备库完成日志写入;
  • 主库设置为SYNCHRONOUS_COMMIT,而所有备库都设置为ASYNCHRONOUS_COMMIT,则主库无需等待;
  • 主库设置为ASYNCHRONOUS_COMMIT,则无视备库上该参数的设置,主库均无需等待。

在多节点的AG环境中,假设一个主库配置了两个同步的secondary,那么是不是要等待这两个secondary都完成日志写入才能提交事务呢?此时又引入了required_synchronized_secondaries_to_commit参数。

关于required_synchronized_secondaries_to_commit

required_synchronized_secondaries_to_commit参数是在SQL Server 2017中引入的,这个参数从直观意义上就可以看得出是指定当commit的时候需要有个几个同步的secondary replica存活。

这个参数在三节点的AG集群中,默认值为1,也就是如果至少要存活一个secondary replica,主库上的事务才可以提交,否则commit就会一直等待。这很好理解。
但是不好理解的是,该参数可以手工修改为0,从字面上看应该是说,即使所有secondary replica都不同步了,也是可以允许commit的。

但是实际情况却并非如此,修改为0是不起作用的。通过以下测试可以知道。

首先,设置required_synchronized_secondaries_to_commit参数为0

<br />sudo pcs resource update ag_cluster required_synchronized_secondaries_to_commit=0<br />

<br />[Kamus@centos1 ~]$ sql<br />1> select name,required_synchronized_secondaries_to_commit from sys.availability_groups;<br />2> GO<br />name required_synchronized_secondaries_to_commit<br />------------------------------ -------------------------------------------<br />ag1 0</p>
<p>(1 rows affected)<br />

现在三个节点都是正常状态。

<br />1> select r.replica_server_name,r.availability_mode_desc,r.session_timeout ,rs.connected_state_desc<br />2> from sys.availability_replicas r,sys.dm_hadr_availability_replica_states rs<br />3> where r.replica_id=rs.replica_id;<br />4> GO<br />replica_server_name availability_mode_desc session_timeout connected_state_desc<br />------------------------------ ------------------------------ --------------- ------------------------------<br />centos1 SYNCHRONOUS_COMMIT 10 CONNECTED<br />centos2 SYNCHRONOUS_COMMIT 10 CONNECTED<br />centos3 SYNCHRONOUS_COMMIT 10 CONNECTED</p>
<p>(3 rows affected)<br />

在主节点上进行Insert,可以成功,这很好。

<br />1> insert into t1 select * from sys.databases;<br />2> GO</p>
<p>(6 rows affected)<br />

停掉一个secodary replica。显示第二个节点已经DISCONNECTED。

<br />1> select r.replica_server_name,r.availability_mode_desc,r.session_timeout ,rs.connected_state_desc<br />2> from sys.availability_replicas r,sys.dm_hadr_availability_replica_states rs<br />3> where r.replica_id=rs.replica_id;<br />4> GO<br />replica_server_name availability_mode_desc session_timeout connected_state_desc<br />------------------------------ ------------------------------ --------------- ------------------------------<br />centos1 SYNCHRONOUS_COMMIT 10 CONNECTED<br />centos2 SYNCHRONOUS_COMMIT 10 DISCONNECTED<br />centos3 SYNCHRONOUS_COMMIT 10 CONNECTED</p>
<p>(3 rows affected)<br />

在主库上进行Insert,还是可以成功,这很好。

<br />1> insert into t1 select * from sys.databases;<br />2> GO</p>
<p>(6 rows affected)<br />

再停掉一个secodary replica。显示2、3节点都已经DISCONNECTED。

<br />1> select r.replica_server_name,r.availability_mode_desc,r.session_timeout ,rs.connected_state_desc<br />2> from sys.availability_replicas r,sys.dm_hadr_availability_replica_states rs<br />3> where r.replica_id=rs.replica_id;<br />4> GO<br />replica_server_name availability_mode_desc session_timeout connected_state_desc<br />------------------------------ ------------------------------ --------------- ------------------------------<br />centos1 SYNCHRONOUS_COMMIT 10 CONNECTED<br />centos2 SYNCHRONOUS_COMMIT 10 DISCONNECTED<br />centos3 SYNCHRONOUS_COMMIT 10 DISCONNECTED</p>
<p>(3 rows affected)<br />

在主库上执行Insert,此时hang住,这很不好。

<br />1> insert into t1 select * from sys.databases;<br />2> GO</p>
<p>

更讨厌的是,对于该表的查询也会hang住,这就更不好了。

<br />2> select count(*) from t1;<br />3> GO</p>
<p>

现在数据库中的等待是什么呢?确实是HADR_SYNC_COMMIT。

<br />1> select STATUS,COMMAND,DATABASE_ID,WAIT_TYPE,WAIT_TIME from sys.dm_exec_requests where command='INSERT';<br />2> GO<br />STATUS COMMAND DATABASE_ID WAIT_TYPE WAIT_TIME<br />------------------------------ ------------------------------ ----------- ------------------------------ -----------<br />suspended INSERT 5 HADR_SYNC_COMMIT 1670</p>
<p>(1 rows affected)<br />

如果我们更进一步做一个session的xevent trace,可以看到等待的是WaitForHarden,而Harden的意思即是remote replica的日志写入。现在主库在等待一个备库的日志完成写入,然后自己才能提交成功。在正常情况下,当主库不再需要等待备库而可以自行commit的情况下,在xevent trace中应该出现将备库的commit_policy标志为donothing状态,也就是在xevent中应该要出现hadr_db_partner_set_policy事件才是正常的,然而这里并没有出现。

但是我们明明把required_synchronized_secondaries_to_commit参数设置为0了,这很违反常识,不是吗?

结论

在SQL on Linux中如果设置了availability_mode为SYNCHRONOUS_COMMIT,那么必须至少有一个secondary replica(或者一个config node)是存活的,否则priamry replica中就不再允许任DML操作,而尝试对于某表进行DML之后,还会进一步阻塞对于该表的查询。即使设置了required_synchronized_secondaries_to_commit=0也是无效的。也许微软需要更新一下文档,明确说明在多个sync的secondary存在的情况下,该参数即使修改为0也仍然按照1来处理。
这是一个很奇怪的design,因为这强制去掉了当一个集群中所有备库都崩溃时,主库能够自动转为异步提交模式的功能,从而造成了所有备库失效则会影响主库业务正常进行这样一个大问题。
实际上这个design是在SQL on Linux 2017 CU1之后才修改的,在CU1之前还是允许当所有备库都失效以后,主库仍然是可以正常读写的。甚至在现在的文档中仍然保留了这样的描述。


以上文档描述来自:High availability and data protection for availability group configurations

这意味着在SQL Server 2017 CU 1之后,不再支持单纯的read-scale功能的AG了。虽然不太理解微软的SQL Server程序员是怎么考虑这个问题的,但是现状就是如此。

相比起Oracle的Data Guard而言,也就是现在SQL Server的AG只有同步(等同于DG的Maximum protection),异步(等同于DG的Maximum performance)这样两种方式,而缺少了DG的Maximum availability模式。
我只能认为这是一个设计理念的问题,微软的程序员更倾向于关注数据一致性,但是我期望在未来SQL Server可以对此进行改进。

Configuring Always On Availability Groups in SQL Server 2017 on Linux

在之前的预览版中,Public preview of the next release of SQL Server on Linux,Always On Availability Groups还是不支持的功能,但是在最新的SQL Server 2017 on Linux中,该功能已经引入。

准备测试环境的服务器

在Always On AG中如果需要自动Failover至少需要集群中有3台服务器,但是我只是测试功能,因此只使用了两台服务器。并且本文不涉及任何Pacemaker的设置,完全是数据库层面的AG配置。

我使用的是Google Compute Engine的2台VM,最低配的1vCPU,3.75GB内存。

如果要通过远程客户端配置SQL Server,则需要在VPC network的Firewall rules中将1433端口开放,如果是在虚拟机本地的sqlcmd中操作,则无需配置。

操作系统:CentOS7

$ cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)

在/etc/hosts中配置双方服务器的名称和IP地址的解析,以保证两台机器可以通过服务器名称互相访问。

重要!服务器主机的hostname必须少于等于15个字符,否则在配置过程会出现各种莫名其妙的权限报错。

安装SQL Server

SQL Server for Linux的安装非常简单,可以参考我之前的这篇文章。

Public preview of the next release of SQL Server on Linux

启用AlwaysOn AG功能

执行范围:在所有机器上执行

安装完的SQL Server,默认是没有启用AlwaysOn AG功能的,需要手工开启,开启的方法很简单。开启该功能需要重启数据库实例。

sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled  1
sudo systemctl restart mssql-server

启用AlwaysOn_health事件

执行范围:在所有机器上执行

这一步不是必须的。

ALTER EVENT SESSION  AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);

创建数据库复制的用户

执行范围:在所有机器上执行

CREATE LOGIN dbm_login WITH PASSWORD = ‘YourPassword’;
CREATE USER dbm_user FOR LOGIN dbm_login;

创建认证

执行范围:在Primary Replica机器上执行

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourPassword';
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
BACKUP CERTIFICATE dbm_certificate
   TO FILE = '/var/opt/mssql/data/dbm_certificate.cer'
   WITH PRIVATE KEY (
   FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
   ENCRYPTION BY PASSWORD = 'YourPassword'
   );

将生成的dbm_certificate.cer和dbm_certificate.pvk文件scp到另外一台服务器的相同位置并修改属主,这台服务器就是Secondary Replica。

cd /var/opt/mssql/data
chown mssql:mssql dbm_certificate.*

然后在这台服务器上导入认证。

执行范围:在Secondary Replica机器上执行

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourPassword';
CREATE CERTIFICATE dbm_certificate
AUTHORIZATION dbm_user
FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
WITH PRIVATE KEY (
FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
DECRYPTION BY PASSWORD = 'YourPassword'
);

创建数据库复制的Endpoint

执行范围:在所有机器上执行

CREATE ENDPOINT [Hadr_endpoint]
AS TCP (LISTENER_PORT = 5022)
FOR DATA_MIRRORING (
ROLE = ALL,
AUTHENTICATION = CERTIFICATE dbm_certificate,
ENCRYPTION = REQUIRED ALGORITHM AES
);
ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
use master
GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [dbm_login];

创建Availability Groups

执行范围:在Primary Replica机器上执行

CREATE AVAILABILITY GROUP [ag1]
   WITH (CLUSTER_TYPE = EXTERNAL)
   FOR REPLICA ON
   N'centos1' WITH (
  ENDPOINT_URL = N'tcp://centos1:5022',
  AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
  FAILOVER_MODE = EXTERNAL,
  SEEDING_MODE = AUTOMATIC
   ),
   N'centos2' WITH (
  ENDPOINT_URL = N'tcp://centos2:5022',
  AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
  FAILOVER_MODE = EXTERNAL,
  SEEDING_MODE = AUTOMATIC
   );

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;

在主库上创建了AG之后,备库需要加入AG。

执行范围:在Secondary Replica机器上执行

ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;

将数据库加入AG

这里新建一个数据库db1,将它加入到ag1中。由于上面设置的SEEDING_MODE参数为AUTOMATIC,因此这个db1数据库将会在备库实例中自动创建,后续对于该库进行的任何操作也会自动复制到备库中。

执行范围:在Primary Replica机器上执行

CREATE DATABASE [db1];
ALTER DATABASE [db1] SET RECOVERY FULL;
BACKUP DATABASE [db1]
   TO DISK = N'/var/opt/mssql/data/db1.bak';

ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1];

允许Secondary Replica可以被只读访问

在以上的创建过程中创建出来的AG中的备库是不允许被访问的,如果要访问将会遇到以下错误。

The target database, ‘db1’, is participating in an availability group and is currently not accessible for queries. Either data movement is suspended or the availability replica is not enabled for read access. To allow read-only access to this and other databases in the availability group, enable read access to one or more secondary availability replicas in the group. For more information, see the ALTER AVAILABILITY GROUP statement in SQL Server Books Online.

执行范围:在Primary Replica机器上执行,立刻生效。

use master
ALTER AVAILABILITY GROUP ag1
   MODIFY REPLICA ON
   N'centos2' WITH (
  SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL )
   );

测试

在主库中随便创建一张新表,再插入几条记录。

1> use db1
2> select * into t_test from sys.databases;
3> insert into t_test select * from t_test;
4> GO
Changed database context to 'db1'.

(5 rows affected)

(5 rows affected)

在备库中查询,这张表已经复制成功。

1> use db1
2> select count(*) from t_test;
3> GO
Changed database context to 'db1'.

-------
 10

(1 rows affected)

如果在备库中尝试更新数据,将会遇到以下错误。

1> delete from t_test;
2> GO
Msg 3906, Level 16, State 2, Server centos2, Line 1
Failed to update database "db1" because the database is read-only.

监控AG状态

通过以下这些视图可以监控AG中各个部分的状态。

group的监控

select * from sys.availability_groups;
select * from sys.availability_groups_cluster;
select * from sys.dm_hadr_availability_group_states;

replica的监控

select * from sys.availability_replicas;
select * from sys.dm_hadr_availability_replica_states;
select * from sys.dm_hadr_availability_replica_cluster_nodes;
select * from sys.dm_hadr_availability_replica_cluster_states;

在AG中的database的监控

select * from sys.availability_databases_cluster;
select * from sys.dm_hadr_database_replica_states;
select * from sys.dm_hadr_database_replica_cluster_states;
select name,database_id,replica_id,group_database_id from sys.databases;

参考文档

本文配置步骤的参考文档为:

https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-availability-group-configure-ha?view=sql-server-linux-2017

Public preview of the next release of SQL Server on Linux

SQL Server for Linux

当微软宣布即将发布SQL Server for Linux版本的时候,有些人觉得很兴奋,有些人觉得然并卵,但是既然Gartner在2016年的数据库管理系统魔力象限图中将微软列在了第一位,超过了一直以来的霸主Oracle,那么无论如何这个SQL Server for Linux版本的发布都是值得关注的,微软将这个版本称为SQL Server vNext on Linux。vNext,好直白的期望。

Gartner-OP-DBMS-MQ-2016

Gartner-OP-DBMS-MQ-2016

微软在2016年11月中旬正式发布了SQL Server for Linux的第一个公众预览版,这条产品线将支持所有的企业级Linux平台,在第一个预览版中支持Red Hat Enterprise Linux 7.2和Ubuntu Linux 16.04,并且支持在macOS和Linux中的Docker容器,后续还会支持Suse Linux Enterprise Server,另外,微软承诺Linux上的SQL Server绝对不会是“SQL Server Lite”这样的阉割版数据库,而会是一个具备SQL Server 2016完整功能集的真正的企业级数据库,比如 in-memory OLTP,还有always-on encryption和row-level security这样的企业级安全功能。在现在的预览版中以下这些功能还不支持,但是后续会逐渐支持。

SQL Server Unsupported features and services

本文中会对SQL Server for Linux的安装、配置、使用做简单的测试,说实话,如果Oracle数据库的安装使用也能这样简单就太好了。

本文使用的测试环境是AWS的一个EC2实例,Red Hat Enterprise Linux 7.2,整个安装过程,从开始下载一直到数据库启动结束,不超过20分钟,这其中还包括了下载RPM包的15分钟。

第一步:用root用户下载安装镜像库的repo文件

sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo

第二步:通过yum安装

sudo yum install -y mssql-server

第三步:设置数据库并启动
Update@2017-05-11
与之前不同,设置数据库的命令整合到mssql-conf命令中,而不再有sqlservr-setup命令。

[root@opreative-server-3 ~]# /opt/mssql/bin/mssql-conf setup
The license terms for this product can be downloaded from
http://go.microsoft.com/fwlink/?LinkId=746388
and found in /usr/share/doc/mssql-server/LICENSE.TXT.

Do you accept the license terms? [Yes/No]:Y
Setting up Microsoft SQL Server
Enter the new SQL Server system administrator password:
Confirm the new SQL Server system administrator password:
Starting Microsoft SQL Server...
Enabling Microsoft SQL Server to run at boot...
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server.service to /usr/lib/systemd/system/mssql-server.service.
Setup completed successfully.

[11:24:34:794][ec2-user@ip-172-31-11-228 ~]$ sudo /opt/mssql/bin/sqlservr-setup
[11:24:34:876]Microsoft(R) SQL Server(R) Setup
[11:24:34:876]
[11:24:34:876]You can abort setup at anytime by pressing Ctrl-C. Start this program
[11:24:34:876]with the –help option for information about running it in unattended
[11:24:34:876]mode.
[11:24:34:876]
[11:24:34:876]The license terms for this product can be downloaded from
[11:24:34:877]http://go.microsoft.com/fwlink/?LinkId=746388 and found
[11:24:34:877]in /usr/share/doc/mssql-server/LICENSE.TXT.
[11:24:34:880]
[11:24:45:937]Do you accept the license terms? If so, please type “YES”: YES
[11:24:45:938]
[11:24:55:008]Please enter a password for the system administrator (SA) account:
[11:24:59:810]Please confirm the password for the system administrator (SA) account:
[11:24:59:810]
[11:24:59:811]Setting system administrator (SA) account password…
[11:25:03:006]
[11:25:07:728]Do you wish to start the SQL Server service now? [y/n]: y
[11:25:11:927]Do you wish to enable SQL Server to start on boot? [y/n]: y
[11:25:12:022]Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server.service to /usr/lib/systemd/system/mssql-server.service.
[11:25:12:058]Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server-telemetry.service to /usr/lib/systemd/system/mssql-server-telemetry.service.
[11:25:12:087]
[11:25:12:088]Setup completed successfully.

That’s it! SQL Server for Linux数据库就安装完毕并正常启动了。

可以通过systemctl来检查mssql-server的服务的启动状态。

[root@opreative-server-3 ~]# systemctl status mssql-server
● mssql-server.service - Microsoft SQL Server Database Engine
   Loaded: loaded (/usr/lib/systemd/system/mssql-server.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-05-11 17:00:17 CST; 34s ago
     Docs: https://docs.microsoft.com/en-us/sql/linux
 Main PID: 16147 (sqlservr)
   CGroup: /system.slice/mssql-server.service
           ├─16147 /opt/mssql/bin/sqlservr
           └─16166 /opt/mssql/bin/sqlservr

May 11 17:00:20 opreative-server-3 sqlservr[16147]: 2017-05-11 17:00:20.52 spid18s     Server is listening on [ 0.0.0.0  1433].
May 11 17:00:20 opreative-server-3 sqlservr[16147]: 2017-05-11 17:00:20.53 Server      Server is listening on [ 127.0.0.1  1434].
May 11 17:00:20 opreative-server-3 sqlservr[16147]: 2017-05-11 17:00:20.53 Server      Dedicated admin connection support was established for listening locally on port 1434.
May 11 17:00:20 opreative-server-3 sqlservr[16147]: 2017-05-11 17:00:20.53 spid18s     SQL Server is now ready for client connections. This is an informational message... required.
May 11 17:00:20 opreative-server-3 sqlservr[16147]: 2017-05-11 17:00:20.86 spid11s     Starting up database 'tempdb'.
May 11 17:00:21 opreative-server-3 sqlservr[16147]: 2017-05-11 17:00:21.03 spid11s     The tempdb database has 1 data file(s).
May 11 17:00:21 opreative-server-3 sqlservr[16147]: 2017-05-11 17:00:21.03 spid22s     The Service Broker endpoint is in disabled or stopped state.
May 11 17:00:21 opreative-server-3 sqlservr[16147]: 2017-05-11 17:00:21.03 spid22s     The Database Mirroring endpoint is in disabled or stopped state.
May 11 17:00:21 opreative-server-3 sqlservr[16147]: 2017-05-11 17:00:21.05 spid22s     Service Broker manager has started.
May 11 17:00:21 opreative-server-3 sqlservr[16147]: 2017-05-11 17:00:21.08 spid7s      Recovery is complete. This is an informational message only. No user action is required.
Hint: Some lines were ellipsized, use -l to show in full.

[ec2-user@ip-172-31-11-228 ~]$ systemctl status mssql-server
● mssql-server.service – Microsoft(R) SQL Server(R) Database Engine
Loaded: loaded (/usr/lib/systemd/system/mssql-server.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2016-12-04 22:25:08 EST; 1min 59s ago
Main PID: 16558 (sqlservr)
CGroup: /system.slice/mssql-server.service
├─16558 /opt/mssql/bin/sqlservr
└─16571 /opt/mssql/bin/sqlservr

安装完毕以后可以通过自带的mssql-conf命令进行一些简单的配置,可配置项不多,主要是监听端口,默认的数据文件所在目录,日志所在目录,备份所在目录等。

[ec2-user@ip-172-31-11-228 ~]$ sudo /opt/mssql/bin/mssql-conf list
Supported settings using the 'set' option: 
tcpport
defaultbackupdir
defaultdumpdir
defaultlogdir
defaultdatadir
For all command line options use -h or --help

如果希望在服务器上直接通过sqlcmd命令行登入数据库,还需要额外安装一个mssql-tools的RPM包,这个安装包里包括sqlcmd和bcp(Bulk import-export utility)。

第一步:用root用户下载安装mssql-tools的repo文件

sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo

第二步:通过yum安装

sudo yum install -y mssql-tools

然后就可以通过sqlcmd来登入数据库,并使用Transact-SQL (T-SQL)语言来进行各种操作和管理了。我并非专业的SQL Server DBA,只是浅尝辄止而已。登录以后,创建了一个新数据库testdb,然后进入testdb,创建了一张新表inventory,然后在inventory表中插入了2条记录。

[ec2-user@ip-172-31-11-228 ~]$ sqlcmd -S localhost -U SA -P 'PASSWORD OF SA'
1> SELECT Name from sys.Databases;
2> GO
Name                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------
master                                                                                                                          
tempdb                                                                                                                          
model                                                                                                                           
msdb                                                                                                                            

(4 rows affected)
1> create database testdb;
2> go
1> SELECT Name from sys.Databases;
2> go
Name                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------
master                                                                                                                          
tempdb                                                                                                                          
model                                                                                                                           
msdb                                                                                                                            
testdb                                                                                                                          

(5 rows affected)
1> use testdb
2> go
Changed database context to 'testdb'.
1> CREATE TABLE inventory (id INT, name NVARCHAR(50), quantity INT);
2> GO
1> INSERT INTO inventory VALUES (1, 'banana', 150);
2> INSERT INTO inventory VALUES (2, 'orange', 154);
3> GO

(1 rows affected)

(1 rows affected)
1> SELECT * FROM inventory WHERE quantity > 152;
2> GO
id          name                                               quantity   
----------- -------------------------------------------------- -----------
          2 orange                                                     154

(1 rows affected)

除了sqlcmd命令行之外,在Windows操作系统下有全套的SQL Server Management Studio (SSMS) ,可以直接使用这个具有丰富功能的图形化管理工具来直接管理SQL Server vNext on Linux。多说一句,由于是使用1433端口连接服务器上的数据库,因此需要在AWS EC2中将该服务器实例所属的Security Group中的Inbound策略中开放TCP 1433端口。

SQL Server Management Studio

【结论】SQL Server vNext on Linux预览版在安装、操作过程中非常顺畅,在后续有更多功能加入以后,应该是企业级数据库非常优秀的选择。先不说是否会有Oracle用户迁移到SQL Server上,这至少给了现在正在使用SQL Server的客户们更广阔的选择空间,现在他们运行在Windows Server上的SQL Server数据库也可以移植到Linux中了,无论如何,这是一个很大的进步,微软这步要是能早一些迈出可能就更好了。