{"id":44525,"date":"2026-05-14T23:39:18","date_gmt":"2026-05-14T21:39:18","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=44525"},"modified":"2026-05-14T23:47:42","modified_gmt":"2026-05-14T21:47:42","slug":"sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/","title":{"rendered":"SQL Server Snapshot Backup and Restore with Proxmox ZFS &#8211; REST API with SQL Server 2025 (3\/3)"},"content":{"rendered":"\n<p>The proposed architecture consists in adding a small internal REST API on the Proxmox server in order to expose a controlled ZFS snapshot operation. SQL Server 2025 can then call this API through sp_invoke_external_rest_endpoint, instead of running SSH commands directly or relying on an external tool.<\/p>\n\n\n\n<p>The role of the API is deliberately limited: it receives a snapshot request, checks that the requested zvol is authorized, and then runs the zfs snapshot command on the Proxmox side. An allowlist is used to restrict the ZFS volumes that can be accessed. This prevents a REST call from being able to manipulate any dataset on the server.<\/p>\n\n\n\n<p>With this approach, we can reproduce a behavior close to what an enterprise storage array provides, but using Proxmox and ZFS. It is important to note that Proxmox does not natively provide the same level of integration as Pure Storage for SQL Server snapshots. Pure Storage provides dedicated mechanisms and integrations. In our case, we need to build a specific orchestration layer. The REST API therefore acts as an adapter between SQL Server, which drives the snapshot backup workflow, and ZFS, which actually performs the storage-level snapshot.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-architecture\">Architecture<\/h2>\n\n\n\n<p>Here is a global overview of the architecture:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SQL Server freezes the database I\/Os<\/li>\n\n\n\n<li>SQL Server 2025 calls the internal REST API<\/li>\n\n\n\n<li>The REST API validates the request and checks the zvol allowlist<\/li>\n\n\n\n<li>The API triggers the ZFS snapshot on Proxmox<\/li>\n\n\n\n<li>The API returns the snapshot information to SQL Server<\/li>\n\n\n\n<li>SQL Server creates the metadata-only backup<\/li>\n\n\n\n<li>The database I\/Os are released<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"998\" height=\"1024\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65-998x1024.png\" alt=\"\" class=\"wp-image-44526\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65-998x1024.png 998w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65-292x300.png 292w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65-768x788.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65-1496x1536.png 1496w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65-1995x2048.png 1995w\" sizes=\"auto, (max-width: 998px) 100vw, 998px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">REST API implementation<\/h2>\n\n\n\n<p>Under Proxmox, we install the required packages:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt update\napt install -y python3-venv sudo openssl<\/code><\/pre>\n\n\n\n<p>We create a dedicated user:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>useradd --system \\\n&nbsp; --home \/opt\/sql-zfs-api \\\n&nbsp; --shell \/usr\/sbin\/nologin \\\n&nbsp; sqlsnap<\/code><\/pre>\n\n\n\n<p>We create the following folders:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/opt\/sql-zfs-api\nmkdir -p \/etc\/sql-zfs-api<\/code><\/pre>\n\n\n\n<p>We declare the authorized zvol :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;\/etc\/sql-zfs-api\/allowed-zvols &lt;&lt;'EOF'\nsqlpool\/pve\/vm-302-disk-0\nEOF<\/code><\/pre>\n\n\n\n<p>We create a root-only allowlist:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chown root:root \/etc\/sql-zfs-api\/allowed-zvols\nchmod 600 \/etc\/sql-zfs-api\/allowed-zvols<\/code><\/pre>\n\n\n\n<p>Then we create the secured ZFS helper. This script is executed as root through sudo, but it rejects any dataset that is not defined in the allowlist.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;\/usr\/local\/sbin\/sql-zfs-helper &lt;&lt;'EOF'\n#!\/usr\/bin\/env bash\nset -euo pipefail\n\nALLOW_FILE=\"\/etc\/sql-zfs-api\/allowed-zvols\"\nLOCK_FILE=\"\/run\/sql-zfs-helper.lock\"\n\ndie() {\n  echo \"$*\" &gt;&amp;2\n  exit 1\n}\n\nexec 9&gt;\"$LOCK_FILE\"\nflock -n 9 || die \"another snapshot operation is already running\"\n\n&#091;&#091; -r \"$ALLOW_FILE\" ]] || die \"allowlist not readable: $ALLOW_FILE\"\n\nmapfile -t ALLOWED_DATASETS &lt; &lt;(grep -Ev '^\\s*(#|$)' \"$ALLOW_FILE\")\n\nis_allowed() {\n  local ds=\"$1\"\n  local allowed\n  for allowed in \"${ALLOWED_DATASETS&#091;@]}\"; do\n    &#091;&#091; \"$ds\" == \"$allowed\" ]] &amp;&amp; return 0\n  done\n  return 1\n}\n\nvalid_snapname() {\n  &#091;&#091; \"$1\" =~ ^&#091;A-Za-z0-9_.:-]{1,120}$ ]]\n}\n\nACTION=\"${1:-}\"\nshift || true\n\ncase \"$ACTION\" in\n  snapshot)\n    SNAPNAME=\"${1:-}\"\n    shift || true\n\n    valid_snapname \"$SNAPNAME\" || die \"invalid snapshot name: $SNAPNAME\"\n    &#091;&#091; \"$#\" -ge 1 ]] || die \"no zvol specified\"\n    &#091;&#091; \"$#\" -le 8 ]] || die \"too many zvols\"\n\n    SNAPSHOTS=()\n\n    for DS in \"$@\"; do\n      is_allowed \"$DS\" || die \"dataset not allowed: $DS\"\n      \/sbin\/zfs list -H -t volume -o name \"$DS\" &gt;\/dev\/null 2&gt;&amp;1 || die \"zvol not found: $DS\"\n\n      FULLSNAP=\"${DS}@${SNAPNAME}\"\n\n      if \/sbin\/zfs list -H -t snapshot -o name \"$FULLSNAP\" &gt;\/dev\/null 2&gt;&amp;1; then\n        die \"snapshot already exists: $FULLSNAP\"\n      fi\n\n      SNAPSHOTS+=(\"$FULLSNAP\")\n    done\n\n    \/sbin\/zfs snapshot \"${SNAPSHOTS&#091;@]}\"\n    \/sbin\/zfs hold sqlsnap \"${SNAPSHOTS&#091;@]}\"\n\n    printf '{\"status\":\"ok\",\"snapshots\":&#091;'\n    SEP=\"\"\n    for S in \"${SNAPSHOTS&#091;@]}\"; do\n      printf '%s\"%s\"' \"$SEP\" \"$S\"\n      SEP=\",\"\n    done\n    printf ']}\\n'\n    ;;\n\n  list)\n    \/sbin\/zfs list -H -t snapshot -o name -r sqlpool | grep '@sql_' || true\n    ;;\n\n  *)\n    die \"usage: sql-zfs-helper snapshot SNAPNAME ZVOL &#091;ZVOL...]\"\n    ;;\nesac\nEOF\n\nchown root:root \/usr\/local\/sbin\/sql-zfs-helper\nchmod 750 \/usr\/local\/sbin\/sql-zfs-helper\n<\/code><\/pre>\n\n\n\n<p>We only allow the helper through sudo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;\/etc\/sudoers.d\/sql-zfs-helper &lt;&lt;'EOF'\nsqlsnap ALL=(root) NOPASSWD: \/usr\/local\/sbin\/sql-zfs-helper *\nEOF\n\nchmod 440 \/etc\/sudoers.d\/sql-zfs-helper\nvisudo -cf \/etc\/sudoers.d\/sql-zfs-helper<\/code><\/pre>\n\n\n\n<p>We install the FastAPI API:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 -m venv \/opt\/sql-zfs-api\/venv\n\/opt\/sql-zfs-api\/venv\/bin\/pip install fastapi \"uvicorn&#091;standard]\"<\/code><\/pre>\n\n\n\n<p>We create the application file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;\/opt\/sql-zfs-api\/app.py &lt;&lt;'EOF'\nimport os\nimport re\nimport json\nimport socket\nimport secrets\nimport subprocess\nfrom datetime import datetime, timezone\nfrom fastapi import FastAPI, Header, HTTPException\nfrom pydantic import BaseModel, Field\n\nAPI_KEY = os.environ.get(\"SQL_ZFS_API_KEY\", \"\")\nALLOW_FILE = \"\/etc\/sql-zfs-api\/allowed-zvols\"\nSNAP_RE = re.compile(r\"^&#091;A-Za-z0-9_.:-]{1,120}$\")\n\napp = FastAPI(title=\"SQL ZFS Snapshot API\", version=\"1.0.0\")\n\n\nclass SnapshotRequest(BaseModel):\n    database: str = Field(..., min_length=1, max_length=128)\n    vmid: int = 302\n    snapname: str = Field(..., min_length=1, max_length=120)\n    zvols: list&#091;str] = Field(..., min_length=1, max_length=8)\n\n\ndef load_allowed_zvols() -&gt; set&#091;str]:\n    with open(ALLOW_FILE, \"r\", encoding=\"utf-8\") as f:\n        return {\n            line.strip()\n            for line in f\n            if line.strip() and not line.strip().startswith(\"#\")\n        }\n\n\ndef check_api_key(x_sqlsnap_key: str | None) -&gt; None:\n    if not API_KEY:\n        raise HTTPException(status_code=500, detail=\"API key not configured\")\n\n    if not x_sqlsnap_key:\n        raise HTTPException(status_code=401, detail=\"missing API key\")\n\n    if not secrets.compare_digest(x_sqlsnap_key, API_KEY):\n        raise HTTPException(status_code=403, detail=\"invalid API key\")\n\n\n@app.get(\"\/health\")\ndef health():\n    return {\n        \"status\": \"ok\",\n        \"host\": socket.gethostname(),\n        \"utc\": datetime.now(timezone.utc).isoformat(),\n    }\n\n\n@app.post(\"\/v1\/sql-zfs\/snapshot\")\ndef create_snapshot(\n    req: SnapshotRequest,\n    x_sqlsnap_key: str | None = Header(default=None, alias=\"x-sqlsnap-key\"),\n):\n    check_api_key(x_sqlsnap_key)\n\n    if not SNAP_RE.fullmatch(req.snapname):\n        raise HTTPException(status_code=400, detail=\"invalid snapname\")\n\n    allowed = load_allowed_zvols()\n\n    for zvol in req.zvols:\n        if zvol not in allowed:\n            raise HTTPException(status_code=403, detail=f\"zvol not allowed: {zvol}\")\n\n    cmd = &#091;\n        \"sudo\",\n        \"\/usr\/local\/sbin\/sql-zfs-helper\",\n        \"snapshot\",\n        req.snapname,\n        *req.zvols,\n    ]\n\n    try:\n        completed = subprocess.run(\n            cmd,\n            text=True,\n            stdout=subprocess.PIPE,\n            stderr=subprocess.PIPE,\n            timeout=30,\n            check=False,\n        )\n    except subprocess.TimeoutExpired:\n        raise HTTPException(status_code=504, detail=\"zfs snapshot timeout\")\n\n    if completed.returncode != 0:\n        raise HTTPException(\n            status_code=500,\n            detail={\n                \"error\": completed.stderr.strip(),\n                \"stdout\": completed.stdout.strip(),\n            },\n        )\n\n    snapshots = &#091;f\"{zvol}@{req.snapname}\" for zvol in req.zvols]\n\n    return {\n        \"status\": \"ok\",\n        \"database\": req.database,\n        \"vmid\": req.vmid,\n        \"snapname\": req.snapname,\n        \"snapshots\": snapshots,\n        \"media_description\": \"zfs|\" + socket.gethostname() + \"|\" + \";\".join(snapshots),\n    }\nEOF\n\nchown -R root:root \/opt\/sql-zfs-api\nchmod 755 \/opt\/sql-zfs-api\nchmod 644 \/opt\/sql-zfs-api\/app.py\n<\/code><\/pre>\n\n\n\n<p>We configure and generate the key:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>APIKEY=\"$(openssl rand -hex 32)\"\necho \"$APIKEY\"<\/code><\/pre>\n\n\n\n<p>We create the environment file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;\/etc\/sql-zfs-api\/sql-zfs-api.env &lt;&lt;EOF\nSQL_ZFS_API_KEY=$APIKEY\nEOF\n\nchown root:root \/etc\/sql-zfs-api\/sql-zfs-api.env\nchmod 600 \/etc\/sql-zfs-api\/sql-zfs-api.env<\/code><\/pre>\n\n\n\n<p>We need to save the generated key.<\/p>\n\n\n\n<p>Next, we enable HTTPS. SQL Server sp_invoke_external_rest_endpoint calls HTTPS endpoints, and the documentation specifies that only HTTPS endpoints with TLS are supported.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl req -x509 -newkey rsa:4096 -sha256 -days 360 -nodes \\\n  -keyout \/etc\/sql-zfs-api\/tls.key \\\n  -out \/etc\/sql-zfs-api\/tls.crt \\\n  -subj \"\/CN=promox1\" \\\n  -addext \"subjectAltName=DNS:promox1,IP:192.168.1.110\"\n\nchown root:sqlsnap \/etc\/sql-zfs-api\/tls.key \/etc\/sql-zfs-api\/tls.crt\nchmod 640 \/etc\/sql-zfs-api\/tls.key\nchmod 644 \/etc\/sql-zfs-api\/tls.crt<\/code><\/pre>\n\n\n\n<p>The \/etc\/sql-zfs-api\/tls.crt certificate must be imported into the Windows trusted root certification authorities on the SQL Server side. Otherwise, the HTTPS call may fail.<\/p>\n\n\n\n<p>We create the systemd service:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;\/etc\/systemd\/system\/sql-zfs-api.service &lt;&lt;'EOF'\n&#091;Unit]\nDescription=SQL Server to ZFS Snapshot API\nAfter=network-online.target\nWants=network-online.target\n\n&#091;Service]\nUser=sqlsnap\nGroup=sqlsnap\nWorkingDirectory=\/opt\/sql-zfs-api\nEnvironmentFile=\/etc\/sql-zfs-api\/sql-zfs-api.env\nExecStart=\/opt\/sql-zfs-api\/venv\/bin\/uvicorn app:app --host 0.0.0.0 --port 8443 --ssl-keyfile \/etc\/sql-zfs-api\/tls.key --ssl-certfile \/etc\/sql-zfs-api\/tls.crt\nRestart=on-failure\nRestartSec=3\n\n&#091;Install]\nWantedBy=multi-user.target\nEOF\n\nsystemctl daemon-reload\nsystemctl enable --now sql-zfs-api\nsystemctl status sql-zfs-api\n<\/code><\/pre>\n\n\n\n<p>We check the status of our API:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"697\" height=\"186\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-67.png\" alt=\"\" class=\"wp-image-44528\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-67.png 697w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-67-300x80.png 300w\" sizes=\"auto, (max-width: 697px) 100vw, 697px\" \/><\/figure>\n\n\n\n<p>It is possible to call the API in PowerShell using Invoke-RestMethod with PowerShell 7:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$headers = @{\n\"Content-Type\"  = \"application\/json\"\n\"x-sqlsnap-key\" = \"MyKey\"\n}\n\n$body = @{\ndatabase = \"StackOverflow\"\nvmid     = 302\nsnapname = \"StackOverflow_test010\"\nzvols    = @(\"sqlpool\/pve\/vm-302-disk-0\")\n} | ConvertTo-Json -Depth 5\n\nInvoke-RestMethod `\n-Uri \"https:\/\/192.168.1.110:8443\/v1\/sql-zfs\/snapshot\" `\n-Method Post `\n-Headers $headers `\n-Body $body `\n-ContentType \"application\/json\" `\n-SkipCertificateCheck\n<\/code><\/pre>\n\n\n\n<p>This gives:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"833\" height=\"510\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-76.png\" alt=\"\" class=\"wp-image-44543\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-76.png 833w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-76-300x184.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-76-768x470.png 768w\" sizes=\"auto, (max-width: 833px) 100vw, 833px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-test-from-sql-server\">Test from SQL Server<\/h2>\n\n\n\n<p>A certificate was generated on Proxmox and it needs to be imported on the SQL Server host. In my case, it was located here:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"404\" height=\"79\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-69.png\" alt=\"\" class=\"wp-image-44530\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-69.png 404w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-69-300x59.png 300w\" sizes=\"auto, (max-width: 404px) 100vw, 404px\" \/><\/figure>\n\n\n\n<p>I then imported it on Windows Server:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"788\" height=\"149\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-70.png\" alt=\"\" class=\"wp-image-44531\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-70.png 788w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-70-300x57.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-70-768x145.png 768w\" sizes=\"auto, (max-width: 788px) 100vw, 788px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"118\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-71-1024x118.png\" alt=\"\" class=\"wp-image-44532\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-71-1024x118.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-71-300x34.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-71-768x88.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-71.png 1384w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>For testing purposes, I created something simple. On the SQL Server side, we can create a database that will be used to store our future stored procedure. This procedure will allow us to interact with the API. In my case, I created a database called dbi_tools:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"244\" height=\"131\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-72.png\" alt=\"\" class=\"wp-image-44533\" \/><\/figure>\n\n\n\n<p>This database will contain a credential. In our case, the DATABASE SCOPED CREDENTIAL is used to securely store the authentication information required to call the REST API from SQL Server. This allows us, for example, to protect the API key:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>USE &#091;dbi_tools]\nGO\n\nIF NOT EXISTS (\n    SELECT 1\n    FROM sys.symmetric_keys\n    WHERE name = '##MS_DatabaseMasterKey##'\n)\nBEGIN\n    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyStrongPassword_%99';\nEND\nGO\n\nCREATE DATABASE SCOPED CREDENTIAL &#091;https:\/\/192.168.1.110:8443\/v1\/sql-zfs\/snapshot]\nWITH\n    IDENTITY = 'HTTPEndpointHeaders',\n    SECRET = '{\"x-sqlsnap-key\":\"MyAPIKey\"}';\nGO<\/code><\/pre>\n\n\n\n<p>We then create a stored procedure to encapsulate the code used to call the API:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>USE dbi_tools;\nGO\n\nCREATE OR ALTER PROCEDURE dbo.usp_BackupDatabase_WithZfsSnapshot\n    @DatabaseName sysname,\n    @BackupDirectory nvarchar(4000) = N'D:\\Backups\\'\nAS\nBEGIN\n    SET NOCOUNT ON;\n\n    DECLARE @Url nvarchar(4000) =\n        N'https:\/\/192.168.1.110:8443\/v1\/sql-zfs\/snapshot';\n\n    DECLARE @Vmid int = 302;\n\n    DECLARE @ZvolsJson nvarchar(max) =\n        N'&#091;\"sqlpool\/pve\/vm-302-disk-0\"]';\n\n    DECLARE @Stamp varchar(20) =\n        REPLACE(REPLACE(CONVERT(varchar(19), SYSUTCDATETIME(), 126), '-', ''), ':', '') + 'Z';\n\n    DECLARE @SafeDbName nvarchar(128) =\n        REPLACE(REPLACE(REPLACE(@DatabaseName, N' ', N'_'), N'&#091;', N''), N']', N'');\n\n    DECLARE @SnapName nvarchar(128) =\n        CONCAT(N'sql_', @SafeDbName, N'_', @Stamp);\n\n    DECLARE @BackupFile nvarchar(4000) =\n        CONCAT(@BackupDirectory, N'\\', @SafeDbName, N'_', @Stamp, N'.bkm');\n\n    DECLARE @Payload nvarchar(max) =\n    (\n        SELECT\n            @DatabaseName AS &#091;database],\n            @Vmid AS &#091;vmid],\n            @SnapName AS &#091;snapname],\n            JSON_QUERY(@ZvolsJson) AS &#091;zvols]\n        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER\n    );\n\n    DECLARE @ReturnCode int;\n    DECLARE @Response nvarchar(max);\n    DECLARE @SnapshotList nvarchar(max);\n\n    SELECT @SnapshotList =\n        STRING_AGG(CONCAT(&#091;value], N'@', @SnapName), N';')\n    FROM OPENJSON(@ZvolsJson);\n\n    DECLARE @MediaDescription nvarchar(max) =\n        CONCAT(N'zfs|promox1|', @SnapshotList);\n\n    DECLARE @Sql nvarchar(max);\n\n    BEGIN TRY\n        SET @Sql =\n            N'ALTER DATABASE ' + QUOTENAME(@DatabaseName) +\n            N' SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON;';\n\n        EXEC sys.sp_executesql @Sql;\n\n        EXEC @ReturnCode = sys.sp_invoke_external_rest_endpoint\n            @url = @Url,\n            @method = N'POST',\n            @headers = N'{\"Content-Type\":\"application\/json\",\"Accept\":\"application\/json\"}',\n            @payload = @Payload,\n            @credential = &#091;https:\/\/192.168.1.110:8443\/v1\/sql-zfs\/snapshot],\n            @timeout = 30,\n            @response = @Response OUTPUT;\n\n        IF @ReturnCode &lt;&gt; 0\n        BEGIN\n            DECLARE @Err nvarchar(max) =\n                CONCAT(N'ZFS snapshot API failed. ReturnCode=', @ReturnCode, N' Response=', @Response);\n            THROW 51001, @Err, 1;\n        END;\n\n        SET @Sql =\n            N'BACKUP DATABASE ' + QUOTENAME(@DatabaseName) + N'\n              TO DISK = @BackupFile\n              WITH METADATA_ONLY,\n                   FORMAT,\n                   MEDIANAME = @MediaName,\n                   MEDIADESCRIPTION = @MediaDescription,\n                   NAME = @BackupName;';\n\n        EXEC sys.sp_executesql\n            @Sql,\n            N'@BackupFile nvarchar(4000),\n              @MediaName nvarchar(128),\n              @MediaDescription nvarchar(max),\n              @BackupName nvarchar(128)',\n            @BackupFile = @BackupFile,\n            @MediaName = @SnapName,\n            @MediaDescription = @MediaDescription,\n            @BackupName = @SnapName;\n\n        SELECT\n            @DatabaseName AS database_name,\n            @SnapName AS zfs_snapshot_name,\n            @SnapshotList AS zfs_snapshots,\n            @BackupFile AS metadata_backup_file,\n            @MediaDescription AS media_description,\n            @Response AS api_response;\n    END TRY\n    BEGIN CATCH\n        IF DATABASEPROPERTYEX(@DatabaseName, 'IsDatabaseSuspendedForSnapshotBackup') = 1\n        BEGIN\n            SET @Sql =\n                N'ALTER DATABASE ' + QUOTENAME(@DatabaseName) +\n                N' SET SUSPEND_FOR_SNAPSHOT_BACKUP = OFF;';\n\n            EXEC sys.sp_executesql @Sql;\n        END;\n\n        THROW;\n    END CATCH\nEND;\nGO\n<\/code><\/pre>\n\n\n\n<p>We then call the stored procedure:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXEC dbi_tools.dbo.usp_BackupDatabase_WithZfsSnapshot\n    @DatabaseName = N'StackOverflow',\n    @BackupDirectory = N'D:\\Backups\\';<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"137\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-73-1024x137.png\" alt=\"\" class=\"wp-image-44534\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-73-1024x137.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-73-300x40.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-73-768x102.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-73.png 1432w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The backup was generated :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"630\" height=\"149\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-74.png\" alt=\"\" class=\"wp-image-44535\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-74.png 630w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-74-300x71.png 300w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"777\" height=\"411\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-75.png\" alt=\"\" class=\"wp-image-44536\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-75.png 777w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-75-300x159.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-75-768x406.png 768w\" sizes=\"auto, (max-width: 777px) 100vw, 777px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-references\">References<\/h2>\n\n\n\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/system-stored-procedures\/sp-invoke-external-rest-endpoint-transact-sql?view=sql-server-ver17&amp;tabs=request-headers\">sp_invoke_external_rest_endpoint<\/a><\/p>\n\n\n\n<p>Thank you. <a href=\"https:\/\/www.linkedin.com\/in\/amine-haloui-76968056\/\">Amine Haloui<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The proposed architecture consists in adding a small internal REST API on the Proxmox server in order to expose a controlled ZFS snapshot operation. SQL Server 2025 can then call this API through sp_invoke_external_rest_endpoint, instead of running SSH commands directly or relying on an external tool. The role of the API is deliberately limited: it [&hellip;]<\/p>\n","protected":false},"author":147,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,198,42,99],"tags":[2974,51,935],"type_dbi":[2874],"class_list":["post-44525","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","category-database-management","category-operating-systems","category-sql-server","tag-proxmox","tag-sql-server","tag-zfs","type-sql-server"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>SQL Server Snapshot Backup and Restore with Proxmox ZFS - REST API with SQL Server 2025 (3\/3) - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL Server Snapshot Backup and Restore with Proxmox ZFS - REST API with SQL Server 2025 (3\/3)\" \/>\n<meta property=\"og:description\" content=\"The proposed architecture consists in adding a small internal REST API on the Proxmox server in order to expose a controlled ZFS snapshot operation. SQL Server 2025 can then call this API through sp_invoke_external_rest_endpoint, instead of running SSH commands directly or relying on an external tool. The role of the API is deliberately limited: it [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-14T21:39:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-14T21:47:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2261\" \/>\n\t<meta property=\"og:image:height\" content=\"2321\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Amine Haloui\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Amine Haloui\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/\"},\"author\":{\"name\":\"Amine Haloui\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/221331d69d49c63fca67069b49b813fe\"},\"headline\":\"SQL Server Snapshot Backup and Restore with Proxmox ZFS &#8211; REST API with SQL Server 2025 (3\\\/3)\",\"datePublished\":\"2026-05-14T21:39:18+00:00\",\"dateModified\":\"2026-05-14T21:47:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/\"},\"wordCount\":602,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/05\\\/image-65-998x1024.png\",\"keywords\":[\"proxmox\",\"SQL Server\",\"ZFS\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Database management\",\"Operating systems\",\"SQL Server\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/\",\"name\":\"SQL Server Snapshot Backup and Restore with Proxmox ZFS - REST API with SQL Server 2025 (3\\\/3) - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/05\\\/image-65-998x1024.png\",\"datePublished\":\"2026-05-14T21:39:18+00:00\",\"dateModified\":\"2026-05-14T21:47:42+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/221331d69d49c63fca67069b49b813fe\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/05\\\/image-65.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/05\\\/image-65.png\",\"width\":2261,\"height\":2321},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL Server Snapshot Backup and Restore with Proxmox ZFS &#8211; REST API with SQL Server 2025 (3\\\/3)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/221331d69d49c63fca67069b49b813fe\",\"name\":\"Amine Haloui\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/64707272207cd8d2667aefcb212f3ff5d19a15813da5aad6553f109d1f1afec1?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/64707272207cd8d2667aefcb212f3ff5d19a15813da5aad6553f109d1f1afec1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/64707272207cd8d2667aefcb212f3ff5d19a15813da5aad6553f109d1f1afec1?s=96&d=mm&r=g\",\"caption\":\"Amine Haloui\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/aminehaloui\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SQL Server Snapshot Backup and Restore with Proxmox ZFS - REST API with SQL Server 2025 (3\/3) - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/","og_locale":"en_US","og_type":"article","og_title":"SQL Server Snapshot Backup and Restore with Proxmox ZFS - REST API with SQL Server 2025 (3\/3)","og_description":"The proposed architecture consists in adding a small internal REST API on the Proxmox server in order to expose a controlled ZFS snapshot operation. SQL Server 2025 can then call this API through sp_invoke_external_rest_endpoint, instead of running SSH commands directly or relying on an external tool. The role of the API is deliberately limited: it [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/","og_site_name":"dbi Blog","article_published_time":"2026-05-14T21:39:18+00:00","article_modified_time":"2026-05-14T21:47:42+00:00","og_image":[{"width":2261,"height":2321,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65.png","type":"image\/png"}],"author":"Amine Haloui","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Amine Haloui","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/"},"author":{"name":"Amine Haloui","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/221331d69d49c63fca67069b49b813fe"},"headline":"SQL Server Snapshot Backup and Restore with Proxmox ZFS &#8211; REST API with SQL Server 2025 (3\/3)","datePublished":"2026-05-14T21:39:18+00:00","dateModified":"2026-05-14T21:47:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/"},"wordCount":602,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65-998x1024.png","keywords":["proxmox","SQL Server","ZFS"],"articleSection":["Database Administration &amp; Monitoring","Database management","Operating systems","SQL Server"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/","url":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/","name":"SQL Server Snapshot Backup and Restore with Proxmox ZFS - REST API with SQL Server 2025 (3\/3) - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65-998x1024.png","datePublished":"2026-05-14T21:39:18+00:00","dateModified":"2026-05-14T21:47:42+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/221331d69d49c63fca67069b49b813fe"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-65.png","width":2261,"height":2321},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-snapshot-backup-and-restore-with-proxmox-zfs-rest-api-with-sql-server-2025-3-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SQL Server Snapshot Backup and Restore with Proxmox ZFS &#8211; REST API with SQL Server 2025 (3\/3)"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/221331d69d49c63fca67069b49b813fe","name":"Amine Haloui","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/64707272207cd8d2667aefcb212f3ff5d19a15813da5aad6553f109d1f1afec1?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/64707272207cd8d2667aefcb212f3ff5d19a15813da5aad6553f109d1f1afec1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/64707272207cd8d2667aefcb212f3ff5d19a15813da5aad6553f109d1f1afec1?s=96&d=mm&r=g","caption":"Amine Haloui"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/aminehaloui\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/44525","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/147"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=44525"}],"version-history":[{"count":16,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/44525\/revisions"}],"predecessor-version":[{"id":44565,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/44525\/revisions\/44565"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=44525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=44525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=44525"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=44525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}