diff --git a/src/cuirass/database.scm b/src/cuirass/database.scm
index bd1b0386faa86d7d9255a270cece4d49e06ac5c5..2f12ed9455143c6ee90c82ddf5fc38ae519e3ac1 100644
--- a/src/cuirass/database.scm
+++ b/src/cuirass/database.scm
@@ -70,6 +70,7 @@
             db-update-build-status!
             db-update-build-worker!
             db-restart-build!
+            db-restart-evaluation!
             db-get-build-products
             db-get-builds-by-search
             db-get-builds
@@ -841,6 +842,13 @@ UPDATE Builds SET stoptime =" now
                      (build-status scheduled)
                      "WHERE id=" build-id ";")))
 
+(define (db-restart-evaluation! eval-id)
+  "Restart the evaluation with EVAL-ID id."
+  (with-db-worker-thread db
+    (exec-query/bind db "UPDATE Builds SET status="
+                     (build-status scheduled)
+                     "WHERE evaluation=" eval-id ";")))
+
 (define (query->bind-arguments query-string)
   "Return a list of keys to query strings by parsing QUERY-STRING."
   (define status-values
diff --git a/tests/database.scm b/tests/database.scm
index 7bb08ea79c3a07f1757b901f34268ffed6745815..8c392163ebe578847de60767bcf72701dab10e16 100644
--- a/tests/database.scm
+++ b/tests/database.scm
@@ -496,6 +496,12 @@ timestamp, checkouttime, evaltime) VALUES ('guix', 0, 0, 0, 0);")
       (eq? (assq-ref (db-get-build "/new-build.drv") #:status)
            (build-status scheduled))))
 
+  (test-assert "db-restart-evaluation!"
+    (let ((build (db-get-build "/old-build.drv")))
+      (db-restart-evaluation! (assq-ref build #:eval-id))
+      (eq? (assq-ref (db-get-build "/old-build.drv") #:status)
+           (build-status scheduled))))
+
   (test-assert "db-close"
     (begin
       (exec-query (%db) (format #f "DROP OWNED BY CURRENT_USER;"))