In short
A production MSSQL backup strategy on a Windows VPS should include full backups, differential backups, transaction log backups for databases in FULL recovery model, off-server copies, retention rules, and restore testing. For many SMB workloads, a practical starting point is daily FULL backups, DIFFERENTIAL backups every few hours, and LOG backups every 15 minutes when point-in-time recovery matters. The most important rule: an untested backup is not a real backup.
Quick verdict
| Situation | Recommended backup approach |
|---|---|
| Production database with important transactions | FULL + DIFFERENTIAL + LOG backups |
| Database in FULL recovery model | Take LOG backups regularly |
| Database in SIMPLE recovery model | FULL + DIFFERENTIAL backups only |
| Small test or dev database | FULL backup may be enough |
| Business-critical SQL workload | Copy backups off-server and test restores |
| SQL Server Express | Use Task Scheduler + sqlcmd; SQL Server Agent is not included |
| SQL Server Standard / Enterprise | Use SQL Server Agent jobs where available |
The goal is not just to create .bak files. The goal is to know how much data you can lose, how fast you can recover, and whether the backup actually restores.
What we tested on Raff
We tested the backup workflow on a Raff Windows VPS running Windows Server 2025 Datacenter Evaluation and SQL Server 2025 Express.

Test environment:
| Item | Value |
|---|---|
| Provider | Raff Technologies |
| OS | Windows Server 2025 Datacenter Evaluation |
| SQL Server | SQL Server 2025 Express |
| Instance | SQLEXPRESS |
| SQL version | 17.0.1000.7, RTM |
| Database | RaffBackupTest |
| Test date | 2026-05-26 |
| Tester | Serdar Tekin |
We verified:
- SQL Server 2025 Express installation
- SQL Server service status
sqlcmdcommand-line access- SQL Server version query
- Sample database creation
- Recovery model check
- FULL recovery model configuration
- Backup folder creation
- FULL backup
- DIFFERENTIAL backup
- LOG backup
- Backup files written to disk
RESTORE VERIFYONLYbackup validation
We tested with SQL Server Express, so some production features differ. SQL Server Agent is not included in Express, and backup compression was not supported in our Express test. For Standard or Enterprise editions, SQL Server Agent and backup compression may be available depending on edition and configuration.
Why backup strategy matters
A SQL Server database can fail in several ways:
- Accidental delete
- Bad application update
- Corrupt data
- Ransomware
- Disk issue
- Failed migration
- Human error
- Broken Windows Update or software change
- VPS-level incident
- Application bug writing bad data
A local backup protects against some database-level mistakes. It does not protect against every risk.
A proper strategy needs:
- Backups created on schedule
- Backups copied away from the server
- Backups retained for the right amount of time
- Restore tests
- Clear RTO and RPO targets
RTO and RPO: decide before designing backups
Before choosing a schedule, define two things.
| Term | Meaning | Example |
|---|---|---|
| RTO | Recovery Time Objective: how fast you need to restore service | Back online within 1 hour |
| RPO | Recovery Point Objective: how much data you can lose | Lose no more than 15 minutes of data |
If your business can only lose 15 minutes of transactions, you need transaction log backups around every 15 minutes.
If your business can tolerate losing one day of changes, a daily full backup may be enough.
Do not design backup schedules blindly. Start with the business risk.
The practical 3-3-2 backup rule
For many SMB SQL Server workloads, use this pattern:
| Layer | Meaning |
|---|---|
| 3 backup levels | FULL, DIFFERENTIAL, and LOG backups |
| 3 copies of data | Production database, local backup, off-server backup |
| 2 storage locations | Local VPS storage plus external storage/provider |
A practical example:
| Backup type | Frequency | Purpose |
|---|---|---|
| FULL | Daily | Complete restore baseline |
| DIFFERENTIAL | Every 4 hours | Faster restore with fewer log files |
| LOG | Every 15 minutes | Point-in-time recovery |
| Off-server copy | Within 30 minutes of backup creation | Protection from server loss or deletion |
This is a starting point. Adjust it based on your RTO, RPO, database size, and workload.
Recovery models: choose first
SQL Server recovery model controls whether transaction log backups are meaningful.
Check current recovery models:
SELECT name, recovery_model_desc FROM sys.databases;
| Recovery model | Use for | Backup pattern |
|---|---|---|
| FULL | Production OLTP, accounting, ERP, financial systems | FULL + DIFFERENTIAL + LOG |
| SIMPLE | Dev/test, reporting, low-risk databases | FULL + DIFFERENTIAL |
| BULK_LOGGED | Special bulk-load workflows | FULL + DIFFERENTIAL + LOG, with caveats |
In our test, we created a sample database and checked its recovery model.

For point-in-time recovery, set the database to FULL recovery model:
ALTER DATABASE RaffBackupTest SET RECOVERY FULL;
Then confirm:
SELECT name, recovery_model_desc FROM sys.databases WHERE name = 'RaffBackupTest';

Important: after switching to FULL recovery model, take a FULL backup to start the log backup chain.
SQL Server Express vs Standard / Enterprise
SQL Server Express is useful for small workloads and testing, but it has limitations that affect backup automation.
| Feature | SQL Server Express | SQL Server Standard / Enterprise |
|---|---|---|
| Database backups | Yes | Yes |
| FULL / DIFF / LOG backups | Yes, depending on recovery model | Yes |
| SQL Server Agent | No | Yes |
| Scheduled backup jobs inside SQL Server Agent | No | Yes |
| Task Scheduler + sqlcmd | Yes | Yes |
| Backup compression | Not supported in our Express test | Often available, edition-dependent |
| Good for this article test | Yes | Yes |
For SQL Server Express, use Windows Task Scheduler with sqlcmd or another automation tool.
For SQL Server Standard or Enterprise, use SQL Server Agent jobs.
Step 1 - Confirm SQL Server is installed
First, check whether a normal SQL Server instance is installed.
Run PowerShell as Administrator:
Get-Service | Where-Object {$_.Name -like "MSSQL*"} | Select-Object Name, Status, DisplayName
After installing SQL Server 2025 Express, our test server showed the SQLEXPRESS instance running.

We also confirmed that sqlcmd was installed:
sqlcmd -?
If sqlcmd is not recognized, install the SQL Server command-line tools or use SSMS for manual testing.
Step 2 - Confirm SQL Server version
Check the SQL Server version:
sqlcmd -S localhost\SQLEXPRESS -E -C -Q "SELECT @@VERSION AS SQLVersion;"
The -C flag tells sqlcmd to trust the server certificate. With newer ODBC drivers, encrypted connections are common by default, and local test instances may use certificates that are not trusted by the client.
In our test, SQL Server 2025 Express was installed successfully.
Step 3 - Create the backup directory
Create a local backup directory:
New-Item -ItemType Directory -Path 'C:\SQL\Backups' -Force
Grant SQL Server Express access to the folder:
icacls 'C:\SQL\Backups' /grant 'NT SERVICE\MSSQL$SQLEXPRESS:(OI)(CI)F'
Verify the folder exists:
Get-ChildItem C:\SQL

For production, do not rely only on the system drive. If possible, use a separate data or backup volume, then copy backups off-server.




