Scoop 数据库安装、Windows 服务与认证配置指南

Scoop 数据库安装、Windows 服务与认证配置指南

Wisansiiz
2026-08-23 / 0 评论 / 3 阅读 / 正在检测是否收录...

Scoop 数据库安装、Windows 服务与认证配置指南

本文记录在 Windows 上通过 Scoop 安装 MySQL LTS、PostgreSQL 和 Redis,并将它们配置为本机自动启动服务、启用密码认证和持久化数据的完整操作。

适用场景:个人开发机、本地测试环境。Redis Windows 构建不建议作为生产部署方案;生产环境优先使用 Linux、容器或托管数据库。

1. 当前部署状态

数据库版本Windows 服务地址认证状态
MySQL LTS9.7.2MySQL127.0.0.1:3306root 密码认证
PostgreSQL18.6PostgreSQL127.0.0.1:5432scram-sha-256
Redis8.10.1Redis127.0.0.1:6379ACL 密码认证

三个服务均设置为 Automatic,并且只面向本机监听。

主要持久化目录:

D:\Scoop\persist\mysql-lts
├── data
└── my.ini

D:\Scoop\persist\postgresql
└── data

D:\Scoop\persist\redis
├── dump.rdb
├── redis.conf
├── users.acl
└── service-runtime-8.10.1

2. 安装与更新 Scoop 软件包

普通 PowerShell:

scoop install mysql-lts postgresql redis

查看安装状态和可用更新:

scoop list
scoop info mysql-lts
scoop info postgresql
scoop info redis

更新三个数据库程序:

scoop update mysql-lts postgresql redis

不要在可复用脚本中假定 Scoop 一定安装在 D:\Scoop,可动态查询路径:

$mysqlRoot = scoop prefix mysql-lts
$postgresRoot = scoop prefix postgresql
$redisRoot = scoop prefix redis

3. MySQL LTS

3.1 配置持久化与本机监听

配置文件:D:\Scoop\persist\mysql-lts\my.ini

[mysqld]
datadir=D:/Scoop/persist/mysql-lts/data
bind-address=127.0.0.1
mysqlx-bind-address=127.0.0.1
port=3306

[client]
user=root

Scoop 的 mysql-lts manifest 会持久化 datamy.ini,更新程序时不应重新初始化已有数据目录。

3.2 注册 Windows 服务

在管理员 PowerShell 中执行:

$mysqlRoot = scoop prefix mysql-lts
$mysqlIni = 'D:\Scoop\persist\mysql-lts\my.ini'

& "$mysqlRoot\bin\mysqld.exe" `
  --install MySQL `
  "--defaults-file=$mysqlIni"

Set-Service MySQL -StartupType Automatic
Start-Service MySQL
Get-Service MySQL

服务命令使用 current 路径时,Scoop 更新后会通过目录链接指向新版本。

3.3 设置或验证 root 密码

连接时使用交互式密码提示,避免密码出现在命令历史和进程参数中:

mysql --protocol=TCP --host=127.0.0.1 --port=3306 --user=root -p

全新初始化且 root 尚无密码时,可在登录后执行:

ALTER USER 'root'@'localhost' IDENTIFIED BY '替换为强密码';

如果无密码登录返回 ERROR 1045,说明数据目录中的 root 已经设置过密码。除非确认需要重置,否则不要使用 --skip-grant-tables 覆盖未知密码,以免现有应用断连。

3.4 创建应用账户

应用程序不要直接使用 root。进入 MySQL 后执行:

CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY '替换为独立强密码';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
SHOW GRANTS FOR 'app_user'@'localhost';

连接示例:

mysql://app_user:<password>@127.0.0.1:3306/app_db

4. PostgreSQL

4.1 注册 Windows 服务

在管理员 PowerShell 中执行:

$postgresRoot = scoop prefix postgresql
$postgresData = 'D:\Scoop\persist\postgresql\data'

& "$postgresRoot\bin\pg_ctl.exe" register `
  -N PostgreSQL `
  -D $postgresData `
  -S auto

Start-Service PostgreSQL
Get-Service PostgreSQL

4.2 设置管理员密码

Scoop 首次初始化通常允许本机 trust 登录。先连接:

psql --host=127.0.0.1 --port=5432 --username=postgres --dbname=postgres

psql 中通过交互式提示设置密码:

\password postgres

4.3 强制使用 SCRAM 密码认证

编辑:

D:\Scoop\persist\postgresql\data\pg_hba.conf

把本机规则中的 trust 改成 scram-sha-256

local   all             all                                     scram-sha-256
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             ::1/128                 scram-sha-256
local   replication     all                                     scram-sha-256
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256

重新加载配置:

$postgresRoot = scoop prefix postgresql
& "$postgresRoot\bin\pg_ctl.exe" reload `
  -D 'D:\Scoop\persist\postgresql\data'

验证密码登录:

psql --host=127.0.0.1 --port=5432 --username=postgres --dbname=postgres

4.4 创建应用账户

进入 psql 后:

CREATE ROLE app_user LOGIN;
\password app_user
CREATE DATABASE app_db OWNER app_user;

连接示例:

postgresql://app_user:<password>@127.0.0.1:5432/app_db

5. Redis

5.1 Scoop Windows 包的服务包装器问题

当前 redis manifest 下载普通的 msys2.zip,其中没有 README 提到的 RedisService.exe。同一发布页另有 msys2-with-Service.zip 资产。

本机采用以下组合:

  1. Redis 主程序由 Scoop 安装和更新。
  2. 使用同版本官方发布资产中的 RedisService.exe 注册 Windows 服务。
  3. 数据、配置、ACL 和服务运行时全部放在 D:\Scoop\persist\redis

项目与发布页:

Redis 8.10.1 with-Service 资产:

https://github.com/redis-windows/redis-windows/releases/download/8.10.1/Redis-8.10.1-Windows-x64-msys2-with-Service.zip
SHA-256: 8D7710C858EB9EF24685D040272FA42F6B045906CBAB14DC635697A20303AF1B

下载后必须核验:

$zip = "$env:TEMP\Redis-8.10.1-Windows-x64-msys2-with-Service.zip"
$expected = '8D7710C858EB9EF24685D040272FA42F6B045906CBAB14DC635697A20303AF1B'

curl.exe -L `
  'https://github.com/redis-windows/redis-windows/releases/download/8.10.1/Redis-8.10.1-Windows-x64-msys2-with-Service.zip' `
  -o $zip

$actual = (Get-FileHash -LiteralPath $zip -Algorithm SHA256).Hash
if ($actual -ne $expected) {
    throw "Redis archive hash mismatch: $actual"
}

5.2 建立持久化目录

管理员 PowerShell:

$redisRoot = scoop prefix redis
$redisPersist = 'D:\Scoop\persist\redis'

New-Item -ItemType Directory -Path $redisPersist -Force | Out-Null

if (Test-Path "$redisRoot\dump.rdb") {
    Copy-Item "$redisRoot\dump.rdb" "$redisPersist\dump.rdb" -Force
}

Copy-Item "$redisRoot\redis.conf" "$redisPersist\redis.conf" -Force

核心配置:D:\Scoop\persist\redis\redis.conf

bind 127.0.0.1 -::1
protected-mode yes
port 6379
dir D:/Scoop/persist/redis
dbfilename dump.rdb
logfile ""
aclfile D:/Scoop/persist/redis/users.acl

5.3 创建默认 ACL 密码

Redis ACL 文件可以保存密码的 SHA-256,而不是明文密码。管理员 PowerShell 示例:

$secure = Read-Host 'Redis default password' -AsSecureString
$pointer = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($secure)

try {
    $plain = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($pointer)
    $bytes = [Text.Encoding]::UTF8.GetBytes($plain)
    $hash = [Convert]::ToHexString(
        [Security.Cryptography.SHA256]::HashData($bytes)
    ).ToLowerInvariant()

    $aclLine = "user default on #$hash ~* &* +@all`n"
    [IO.File]::WriteAllText(
        'D:\Scoop\persist\redis\users.acl',
        $aclLine,
        [Text.UTF8Encoding]::new($false)
    )
}
finally {
    [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($pointer)
    Remove-Variable plain -ErrorAction SilentlyContinue
}

5.4 注册 Redis 服务

with-Service 压缩包内容解压到类似目录:

D:\Scoop\persist\redis\service-runtime-8.10.1

管理员 PowerShell:

$wrapper = 'D:\Scoop\persist\redis\service-runtime-8.10.1\RedisService.exe'
$config = 'D:\Scoop\persist\redis\redis.conf'

& $wrapper install `
  -c $config `
  --service-name Redis `
  --display-name 'Redis Database Server (Scoop)' `
  --description 'Redis Database Server (Scoop, official RedisService wrapper)' `
  --start-mode auto

Start-Service Redis
Get-Service Redis

验证认证:

redis-cli --host 127.0.0.1 --port 6379 --user default --askpass ping

成功结果:

PONG

5.5 创建应用 ACL 用户

先使用默认管理员账户连接:

redis-cli --host 127.0.0.1 --port 6379 --user default --askpass

在 Redis CLI 中创建应用用户并保存 ACL:

ACL SETUSER app_user on >替换为独立强密码 ~app:* +@read +@write +ping
ACL SAVE
ACL LIST

~app:* 限制用户只能访问 app: 前缀的键。根据应用需要继续缩小命令权限,不要在生产环境直接授予 +@all

连接示例:

redis://app_user:<password>@127.0.0.1:6379/0

6. 服务管理与验证

查看状态:

Get-Service MySQL,PostgreSQL,Redis

启动、停止和重启:

Start-Service MySQL,PostgreSQL,Redis
Stop-Service MySQL,PostgreSQL,Redis
Restart-Service MySQL,PostgreSQL,Redis

查看服务实际启动命令:

sc.exe qc MySQL
sc.exe qc PostgreSQL
sc.exe qc Redis

客户端连接测试:

mysql --host=127.0.0.1 --port=3306 --user=root -p
psql --host=127.0.0.1 --port=5432 --username=postgres --dbname=postgres
redis-cli --host 127.0.0.1 --port 6379 --user default --askpass ping

查看端口监听情况需要管理员权限:

Get-NetTCPConnection -State Listen -LocalPort 3306,5432,6379

7. 凭据管理

本机凭据文件:

C:\Users\Wisansiiz\.config\database-services\credentials.txt

建议:

  • 不要把真实密码写入本仓库、Git、README 或共享脚本。
  • 应用使用独立低权限账户,不直接使用 rootpostgres 或 Redis default
  • 开发框架优先通过系统环境变量、.env.local 或密码管理器读取连接信息。
  • .env* 应加入 .gitignore,提交前使用 git diff --cached 再检查一次。
  • 如果凭据曾出现在聊天、终端历史或日志中,按已泄漏处理并轮换。

8. 更新、备份和升级注意事项

更新前备份

MySQL:

mysqldump --host=127.0.0.1 --user=root -p `
  --all-databases --single-transaction `
  --result-file=mysql-all.sql

PostgreSQL:

pg_dumpall --host=127.0.0.1 --username=postgres `
  --file=postgres-all.sql

Redis:

redis-cli --host 127.0.0.1 --port 6379 --user default --askpass save
Copy-Item 'D:\Scoop\persist\redis\dump.rdb' '.\redis-dump-backup.rdb'

版本升级

  • MySQL 和 PostgreSQL 的 Scoop manifest 已声明数据目录持久化,但更新前仍应备份。
  • PostgreSQL 跨主版本升级不能仅把旧数据目录指向新程序;应使用 pg_upgrade 或逻辑备份与恢复。
  • Redis Scoop manifest 没有声明 dump.rdb、配置和 ACL 的持久化,因此必须继续使用独立的 D:\Scoop\persist\redis
  • Redis 更新后,需要取得相同新版本的 with-Service 资产、验证哈希、更新 service-runtime-<version>,然后重新注册服务。

9. 常见问题

MySQL 返回 ERROR 1045

这通常表示 root 已有密码,不代表服务启动失败。先使用现有密码连接,不要直接重置授权表。

Redis 报配置路径不存在

普通 redis-server.exe 基于 MSYS2/Cygwin,命令行中的 Windows 路径可能被错误拼接。直接运行时应使用:

/cygdrive/d/Scoop/persist/redis/redis.conf

注册服务时优先使用同版本 RedisService.exe,由包装器处理路径转换。

Redis 报 Can't open the log file

服务模式应使用绝对路径,或者设置:

logfile ""

让服务管理器接管标准输出日志。

Redis 服务长期停在 StopPending

这是 NSSM 包装 MSYS2 Redis 时可能出现的停止兼容问题。本机最终方案已改用 Redis Windows 发布项目自带的 RedisService.exe

PowerShell 输出 PSReadLine prediction 警告

在输出被重定向或无虚拟终端的会话中,Set-PSReadLineOption -PredictionSource History 可能提示无法启用预测。这与数据库安装、服务注册和运行状态无关。

10. 移除服务

执行前先完成数据备份。以下操作只删除 Windows 服务定义,不应直接删除持久化数据目录。

管理员 PowerShell:

Stop-Service MySQL,PostgreSQL,Redis

& "$(scoop prefix mysql-lts)\bin\mysqld.exe" --remove MySQL
& "$(scoop prefix postgresql)\bin\pg_ctl.exe" unregister -N PostgreSQL
& 'D:\Scoop\persist\redis\service-runtime-8.10.1\RedisService.exe' `
  uninstall --service-name Redis

确认服务定义已经移除后,再决定是否执行 Scoop 卸载:

scoop uninstall mysql-lts postgresql redis

不要在没有备份和确认路径的情况下递归删除 D:\Scoop\persist\mysql-ltspostgresqlredis

0

评论 (0)

取消