Always On Listener能ping通应用连不上
Always On Listener能ping通应用连不上Always On 搭完以后,Listener / VIP 能 ping 通,但是禅道应用连不上。
这个现象很容易误导人。能 ping 通只能说明 IP 层大概通,不代表 SQL Server 1433、Listener、当前主副本、应用连接串都没问题。
先确认 VIP 在哪台Linux + Pacemaker 场景,先看集群资源:
1pcs status
看 VIP 当前落在哪台机器上。然后确认这台是不是 SQL Server 当前主副本。
SQL 查:
1234567SELECT ar.replica_server_name, ars.role_desc, ars.synchronization_health_descFROM sys.availability_replicas arJOIN sys.dm_hadr_availability_replica_states ars ON ar.replica_id = ars.replica_id;
如果 VIP 在 db02,但主副本还在 d ...
SQL Server Always On部署
SQL Server Always On部署这次 SQL Server 是 Linux 机器,不是 Windows 上那套 WSFC。
所以 Always On 这里要先说明一下:Linux 下可用性组本身还是 SQL Server 的 AG,但集群管理走 Pacemaker。客户说“主从容灾”,不能直接按 MySQL 主从去理解。
这里记录核心步骤,具体环境里的主机名和 IP 都脱敏。
12db01 10.10.20.11db02 10.10.20.12
开启 HADR两台都执行:
12/opt/mssql/bin/mssql-conf set hadr.hadrenabled 1systemctl restart mssql-server
检查:
1SELECT SERVERPROPERTY('IsHadrEnabled') AS IsHadrEnabled;
返回 1 才对。
创建 master key、证书和 endpoint 用户db01:
123456789101112USE master;GOCREATE MASTER KEY ENCRYPT ...
SQL Server日志文件ldf过大
SQL Server日志文件ldf过大SQL Server 刚开始压测没多久,客户那边说磁盘空间掉得很快。
上去一看,.ldf 比 .mdf 还大。这个时候不能直接删 ldf,也不要上来就 shrink。
SQL Server 的 ldf 是事务日志,不是普通日志文件。
先看日志空间1DBCC SQLPERF(LOGSPACE);
也可以查数据库文件:
12345678SELECT DB_NAME(database_id) AS db_name, type_desc, name, size * 8 / 1024 AS size_mb, physical_nameFROM sys.master_filesWHERE DB_NAME(database_id) = 'zentao';
看恢复模式123SELECT name, recovery_model_descFROM sys.databasesWHERE name = 'zentao';
如果是 FULL 恢复模式,但一直没有做日志备份,日志就不会按预期截断,文 ...
SQL Server差异备份还原不上
SQL Server差异备份还原不上客户问备份怎么做、能不能恢复到某个时间点。这个时候就不能按 MySQL dump 的思路想了。
SQL Server 这里有完整备份、差异备份、日志备份,顺序错了就还原不上。
当时差异备份还原失败,最后发现是基准备份不对,备份链断了。
先看恢复模式123SELECT name, recovery_model_descFROM sys.databasesWHERE name = 'zentao';
如果要做日志备份和时间点恢复,生产库一般是 FULL。
1ALTER DATABASE zentao SET RECOVERY FULL;
注意:刚切到 FULL 后,要先做一次完整备份,后面的日志备份链才有意义。
完整备份123BACKUP DATABASE zentaoTO DISK = N'/data/backup/zentao_full_20220410.bak'WITH INIT, COMPRESSION, CHECKSUM, STATS = 10;
差异备份123BACKUP DATABASE zen ...
禅道SQL Server自增ID问题
禅道SQL Server自增ID问题分页改完以后,又遇到一个问题:新增数据成功了,但后面拿自增 ID 的地方不对。
MySQL 里常见是 AUTO_INCREMENT,插入后用 LAST_INSERT_ID() 或驱动里的 lastInsertId。SQL Server 里是 IDENTITY,取法不一样。
MySQL 写法MySQL 建表大概这样:
12345CREATE TABLE zt_demo ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, PRIMARY KEY (id));
插入:
12INSERT INTO zt_demo(name) VALUES ('test');SELECT LAST_INSERT_ID();
SQL Server 写法SQL Server 自增列用 IDENTITY:
1234CREATE TABLE dbo.zt_demo ( id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, name ...
禅道SQL Server分页问题
禅道SQL Server分页问题禅道从 MySQL 切到 SQL Server 后,最先炸的是分页。
MySQL 里随手写:
1234SELECT id, nameFROM zt_productORDER BY id DESCLIMIT 20, 10;
SQL Server 里不认这个写法。
当时页面报错大概就是 SQL 语法错误,查日志才看到 LIMIT。
MySQL 的 LIMITMySQL 常见两种:
12345-- 取前10条SELECT * FROM zt_product LIMIT 10;-- 跳过20条,再取10条SELECT * FROM zt_product LIMIT 20, 10;
第二个里面:
1220 是 offset10 是 page size
SQL Server 取前几条SQL Server 取前 10 条常用 TOP:
123SELECT TOP (10) id, nameFROM dbo.zt_productORDER BY id DESC;
注意 TOP 是放在 SELECT 后面,不是 SQL 最后。
SQL Server 分页SQL S ...
SQL Server 1433连不上
SQL Server 1433连不上SQL Server 装完以后,本机 sqlcmd 能进,但是应用机连 10.10.20.11,1433 一直失败。
这种问题不要一开始就怀疑账号密码。先确认 1433 到底有没有监听、有没有放行。
先看服务1systemctl status mssql-server
查版本:
1/opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U sa -P '******' -Q "SELECT @@VERSION"
本机能进,说明 SQL Server 服务基本正常。
看 1433 是否监听1ss -lntp | grep 1433
正常应该能看到类似:
1LISTEN 0 128 *:1433 *:* users:(("sqlservr",pid=1234,fd=123))
如果没监听,先看 SQL Server TCP 配置。
1/opt/mssql/bin/mssql-conf get network.tcpport
设置端口:
12/opt/mssq ...
禅道报could not find driver
禅道报could not find driver禅道配置改完以后,页面直接报:
1could not find driver
这个错误看起来像数据库连不上,但其实还没到 SQL Server。PHP 这边连 SQL Server 的驱动都没有,所以 PDO 找不到 driver。
MySQL 常见是 pdo_mysql,SQL Server 要用 pdo_sqlsrv,另外还有 sqlsrv 扩展。
先看 PHP 版本1php -v
当时是 PHP 7.4。
再看扩展:
1php -m | grep -E 'PDO|sqlsrv|pdo_sqlsrv'
如果只有:
1PDO
没有 pdo_sqlsrv,那就对上了。
装 Microsoft ODBC DriverCentOS 7 上先加微软源。
12curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repoACCEPT_EULA=Y yum install -y mso ...
禅道接入SQL Server
禅道接入SQL Server禅道默认更多是 MySQL 场景,这次客户要求后端数据库走 SQL Server。
一开始我以为就是改个连接配置,后来发现不只是连接问题。SQL Server 里登录名、数据库用户、schema、权限是分层的,和 MySQL 那种建个用户授权库的感觉不太一样。
这里先记最基础的接入过程。
版本数据库机器是 CentOS 7,SQL Server 用的是 2019 15.x。
1/opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U sa -P '******' -Q "SELECT @@VERSION"
或者进 SQL 后查:
1234SELECT SERVERPROPERTY('ProductVersion') AS product_version, SERVERPROPERTY('ProductLevel') AS product_level, SERVERPROPERTY('Edition') AS e ...
记一次客户从0部署禅道
记一次客户从0部署禅道这次是客户给了几台空 VPS,直接在他们环境上搭。
一开始想得比较简单,禅道不就是 PHP + Web + 数据库。真开始弄以后发现,空机器最麻烦的反而不是安装包,是每台机器的基础环境要先统一。不然后面 SQL Server、Redis、F5 一起接进来,问题会混在一起,很难判断是哪一层。
机器信息这里都脱敏,大概是这样:
1234567app01 10.10.10.11 禅道应用节点1app02 10.10.10.12 禅道应用节点2db01 10.10.20.11 SQL Server主库db02 10.10.20.12 SQL Server备库redis01 10.10.30.11 Redis master / Sentinelredis02 10.10.30.12 Redis replica / Sentinelredis03 10.10.30.13 Redis replica / Sentinel
系统统一按 CentOS 7.x 来。
12cat /etc/centos-re ...

