BC14: Job Queue mit Powershell

12. September 2023 16:00

Hallo, ich möchte die Job Queue (oder neudeutsch Aufgabewarteschlangenposten) mittels Powershell oder SQL anpassen:
Szenario:
zum Erstellen einer DEBUG-Umgebung soll ein Backup der PROD-DB gezogen werden.
Damit nicht beim Restore/Hochfahren der DEBUG-DB die Job Queue anläuft, wollen wir alle Einträge mittels Script (powershell oder sql) auf abwarten setzten.
Dann soll das Backup erstellt werden (SQL Boardmittel)
und dann auf der PROD-Umgebung die Job Queue Einträge wieder aktivieren wie vor dem deaktivieren

Manuell nach dem Erstellen der Datenbank kein Problem, im Script passiert nichts.

Habt Ihr Ideen, wie man das Loslaufen verhindern kann?
Es gibt keinen Dienst für die Jobqueue, ist nicht gewünscht...

Re: BC14: Job Queue mit Powershell

12. September 2023 18:35

Hallo,

warum deaktivierst du nicht einfach den Job- Scheduler in deinem Test- Service?

Gruß Fiddi

Re: BC14: Job Queue mit Powershell

12. September 2023 21:20

Hi,


stimmt, das wäre eine Idee. Wir wollen das aber automatisiert laufen lassen und da wäre es cool, wenn wir die Jobs in PROD anhalten können scriptbasiert, dann ein Backup ziehen und dann die richtigen Jobs wieder aktivieren könnten...

Viele Grüße
Christoph

Re: BC14: Job Queue mit Powershell

12. September 2023 22:28

Hallo,

Nun ganz einfach geht das, indem du den ServiceTier PROD einfach stoppst, und dann die Datensicherung durchführst.

Eine andere Möglichkeit wäre, die Datensicherung zu einem Zeitpunkt zu starten, an dem keine Job-Queue- Aufträge laufen.

Gruß Fiddi

Re: BC14: Job Queue mit Powershell

13. September 2023 07:39

christophhennef hat geschrieben:Manuell nach dem Erstellen der Datenbank kein Problem, im Script passiert nichts.


ja, ich denke das liegt daran, dass du das Script nicht gepostet hast :lol:

jetzt im Ernst - wenn dann brauchen wir das "Script".

Du kannst via PS und Invoke-NAVCodeunit eine Codeunit ansteuern, die dann genau das macht, was du willst - in diesem Fall halt die Aufgabenwarteschlangenposten auf abwarten setzt.

damit solltest du das wunderbar automatisieren können.

Re: BC14: Job Queue mit Powershell

14. September 2023 08:41

Also, aktuell bin ich dran, das mittels Powershell komplett zu lösen...

Hier das Powershell-Script:
Code:
Write-Host -ForegroundColor Yellow "Start DB Clone..."

# erster Schritt JobQueue RPOD abschalten
Write-Host -ForegroundColor Yellow "Schritt 1: Stopp JobQueue in PROD-DB"
# load NAV Admin PS
Import-Module "NavAdminTool.ps1"
# Ausscahlten JobQueue
foreach ($inp -eq 0 {
        . c:\users\test\stop_jc.ps1
   
}


# zweiter Scritt DB-Backup erzeugen von PROD-DB
Write-Host -ForegroundColor Yellow "Schritt 2: DB Backup PROOD-DB"
invoke-sqlcmd -inputfile "backup_prod_db.sql"  -serverinstance "SQL" -database "TEST"


# dritter Schritt wenn Backup erfolgreich, JobQueue PROD wieder aktivieren
if (Test-Path $fileToCheck -PathType leaf)
{
    #do some stuff
   Write-Host -ForegroundColor Yellow "Schritt 3: Start JobQueue in PROD-DB"
   # load NAV Admin PS
    Import-Module "NavAdminTool.ps1"
   # enable Jobqueue
   
}

# vierter Schritt: Start Restore auf DEBUG
Write-Host -ForegroundColor Yellow "Schritt 4: Restore DEBUG-DB  aus Backup PROD"
invoke-sqlcmd -inputfile "20230901_cre_debug.sql"  -serverinstance "SQL"


# fünfter Schritt: Start Restore auf DEBUG
Write-Host -ForegroundColor Yellow "Schritt 5: Restore REPORT-DB aus Backup PROD"
invoke-sqlcmd -inputfile "20230901_cre_report.sql"  -serverinstance "SQL"


# fertig
Write-Host -ForegroundColor Yellow "Database DEBUG und REPORT aus PROD erzeugt..."


mittlerweile bin ich über eine Codeunit gestolpert, mit der man die Job Queue wohl verwalten kann:
Codeunit 456 JobQueueManagement
Jedoch gelingt es mir nicht, diese von außen anzusprechen.

Ein Kollege hat dann folgendes versucht, aber das klappt auch nicht... :(

Code:
#SOAP URL für den Service (In BC unter Webdienste)
$webServiceUrl = "http://www.test.de:7047/TEST/WS/xxx/Codeunit/JobQueueManagement"



# Anmeldedaten SUPE USER
$username = "xxxxxxxxxxxx"
$password = "xxxxxxxxxxxx"

# Aufgabenwarteschlangenposten IDs die auf abwarten gesetzt werden sollen
$jobQueueIds = @(
    "1281"
)

# XML Request erstellen
$xmlRequest = @"
<JobQueueManagement xmlns="urn:microsoft-dynamics-schemas/codeunit/JobQueueManagement">
    <JobQueueIds>$($jobQueueIds -join ',')</JobQueueIds>
</JobQueueManagement>
"@

# Anmeldung zum Webdienst
$credentials = New-Object System.Management.Automation.PSCredential ($username, (ConvertTo-SecureString $password -AsPlainText -Force))

# HTTP Request um JobQueues auf abwarten zu setzen
$response = Invoke-RestMethod -Uri $webServiceUrl -Method Post -Credential $credentials -ContentType "application/xml" -Body $xmlRequest

Write-Host $response

Re: BC14: Job Queue mit Powershell

14. September 2023 09:31

christophhennef hat geschrieben:Hi,


stimmt, das wäre eine Idee. Wir wollen das aber automatisiert laufen lassen und da wäre es cool, wenn wir die Jobs in PROD anhalten können scriptbasiert, dann ein Backup ziehen und dann die richtigen Jobs wieder aktivieren könnten...

Viele Grüße
Christoph

Und wozu braucht ihr das? Wenn im Test-Service kein Jobscheduler läuft passiert da nichts. Wird die Debug-DB auch automatisiert per SQL eingelesen? Dann könntest du auch an dieser Stelle einfach die Job queue Einträge weglöschen oder per SQL auf abwarten setzen.

Re: BC14: Job Queue mit Powershell

14. September 2023 10:03

Hallo MIchael,

da hast Du Recht, aber es - leider - auf der Ziel-DB auch einen Job Sheduler, so dass hier Jobs loslaufen könnten.

Daher brauchen wir das... :(

Das mit dem SQL auf Abwarten setzen habe ich versucht, manuell geht das auch super, aber im Script nicht.
Ich poste gleich das Script dazu (muss ich gerade gucken, wo ich das habe)

Re: BC14: Job Queue mit Powershell

14. September 2023 10:34

Hier noch das Script, was ich für das SQL nutzen würde.. Jedoch klappt das Update manuell, aber im Script nicht.
Zudem müsste mandas eigentlich auf der Quell-DB starten, damit beim Backup die Einträge schon richtig wären und nach dem Restore kein Job anläuft..
Daher kam ich auf die Idee mit dem Powershell JobQueueManagement...:
- Anhalten auf PROD der Jobs
- Backup ziehen von PROD
- Wieder aktivieren der Jobs auf PROD
- Restore..... etc..


Code:
DECLARE @SourceDatabaseName varchar(200)
DECLARE @SourceDatabaseLogicalName varchar(200)
DECLARE @SourceDatabaseLogicalNameForLog varchar(200)
DECLARE @query varchar(2000)
DECLARE @DataFile varchar(2000)
DECLARE @LogFile varchar(2000)
DECLARE @BackupFile varchar(2000)
DECLARE @TargetDatabaseName varchar(200)
DECLARE @TargetDatbaseFolder varchar(2000)

-- ****************************************************************

SET @SourceDatabaseName = '[quelle]'                 -- Name of the source database
SET @SourceDatabaseLogicalName = 'Demo Database BC (20-0)_Data'                -- Logical name of the DB ( check DB properties / Files tab )
SET @SourceDatabaseLogicalNameForLog = 'Demo Database BC (20-0)_Log'  -- Logical name of the DB ( check DB properties / Files tab )
SET @BackupFile = 'd:\BACKUP\TESTBACKUP.bak'                                  -- FileName of the backup file
SET @TargetDatabaseName = 'DEBUG'                        -- Name of the target database
SET @TargetDatbaseFolder = 'D:\DATA\'


DECLARE @TableName VARCHAR(255);

DECLARE TableList CURSOR LOCAL FAST_FORWARD FOR
SELECT name
FROM sys.objects
WHERE name LIKE '%job queue entry$%'
      AND type_desc LIKE '%TABLE%';

OPEN TableList;
FETCH NEXT FROM TableList
INTO @TableName;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @Query = 'update table [debug].[dbo].[' + @TableName + '] set status = 3 where status <> 3;';
    PRINT 'Executing query : Update JobQueue ';
    PRINT @Query;
    EXEC (@Query);
    FETCH NEXT FROM TableList
    INTO @TableName;
END;
PRINT 'OK!';

Re: BC14: Job Queue mit Powershell

14. September 2023 11:32

christophhennef hat geschrieben:...
Zudem müsste mandas eigentlich auf der Quell-DB starten, damit beim Backup die Einträge schon richtig wären und nach dem Restore kein Job anläuft..
Daher kam ich auf die Idee mit dem Powershell JobQueueManagement...:
- Anhalten auf PROD der Jobs
...

Würde ich persönlich nicht machen. Und das auch nicht per SQL. Hätte ich zuviel Angst, dass die nicht mehr loslaufen.

Warum dein Skript nicht funktioniert, weiß ich leider nicht.

Re: BC14: Job Queue mit Powershell

14. September 2023 14:23

schon mal meinen Vorschlag in Betracht gezogen?