Dynamics AX : Read Committed Snapshot Isolation (RCSI)

J'ai fait face à des problèmes du verrouillage de table (locks) avec le système Dynamics AX 2012 R3. Sans entrer dans les détails, le problème survenait lorsque la connexion à la base de données était effectuée via la classe UserConnection.

Je pouvais voir une requête très simple avec INSERT qui ne terminait jamais. La requête causait un lock sur la table, ainsi lorsqu'un autre utilisateur effectuait une requête sur la même table, son client AX ne répondait plus.

Le problème est dû à une configuration de la base de données: Allow Snapshot Isolation et Read Committed Snapshot Isolation (RCSI) étaient désactivés, le même problème est documenté sur le blogue suivant Microsoft Severe SQL Locking and Blocking on Dynamics AX

J'ai aussi mis à jour ce billet: Dynamics AX 2012 : SQL Settings

Dynamics AX : AxHLink.exe et RemoteApp

Une entreprise veut utiliser RemoteApp afin de publier le client Dynamics AX et elle veut utiliser les notifications courriel pour leur système de workflow. L’utilisateur reçoit un courriel qui ressemble à ceci:

An item in Microsoft Dynamics AX requires your attention. Please see below message for details.

Subject: Dynamics AX Notification: Workflow Item Review Journal Batch GJBN000084 in Legal Entity 0100
Message: Please review Journal Batch GJBN000084 in Legal Entity 0100

Please review the original business document or the associated alert for more information.

Lorsque l’utilisateur clique sur le lien, la commande dynamics exécute l’outil AxHlink.exe et passe en paramètre la cible. Cette partie est bien expliquée dans ce blogue: How to open a form in a running Ax client from an external application.

Dans mon cas, le problème est que Microsoft Outlook est installé localement sur la machine et le client Dynamics AX est installé sur le serveur RemoteApp. Donc, lorsque l’utilisateur clique sur le lien, Windows ne trouve pas l'outil AxHLink.exe

J’ai dû bâtir une petite solution avec PowerShell afin de faire fonctionner le lien.

Ça ressemble à ceci:



Tout d’abord, il faut publier Ax32.exe et AxHLink.exe sur le serveur RemoteApp. 


Il faut s'assurer que l'application AXHlink accepte les paramètres.




Ensuite mon but est de lancer AXHlink RemoteApp lorsque l’utilisateur clique sur le lien dans le courriel. Pour ce faire, je lance un script powershell lorsque la commande dynamics est exécutée

email --> link --> dynamics --> Registry --> PowerShell Script --> .RDP file

La commande dynamics n’est pas reconnue par défaut si le client AX n'est pas installé. Dans mon cas, il faut l’ajouter à la base de registres de l'ordinateur local. Lorsque l'utilisateur clique sur le lien dans le courriel, je veux lancer un script Power Shell.

RegKey.reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\dynamics]
"URL Protocol"=""
@="\"URL:dynamics link\""

[HKEY_CLASSES_ROOT\dynamics\shell\open\command]
@="powershell.exe -WindowStyle Hidden -executionpolicy bypass -NonInteractive -NoLogo -file \"\\\\SERVERNAME\\SHAREDFOLDER\\Tools\\AXHlink.ps1\" %1"

RDP file

Comme j’ai dit, mon script PowerShell va lancer un fichier .RDP. Donc, il me faut ce fichier RDP. Afin de l’obtenir, j’ai configuré RemoteApp and Desktop Connections sur ma machine locale.


Ensuite il suffit de suivre le "target" afin de trouver le fichier RDP associer à l'application AxHlink. Notez que vous devez activer l'option "show the Remote App program in RD web access" afin de télécharger le fichier RDP. Ensuite, vous pouvez désactiver "Show the Remonte App program in RD web access".



AxHLink_Template.rdp

Ce fichier deviendra votre gabarit de base. Vous pouvez aussi optimiser le fichier RDP, par exemple j’ai désactivé toutes les redirections.

redirectclipboard:i:0
redirectprinters:i:0
redirectcomports:i:0
redirectsmartcards:i:0
devicestoredirect:s:
drivestoredirect:s:0
redirectdrives:i:0

Il faut aussi enlever la signature.



AXHlink.ps1

Le défi est d'appeler l'application AxHLink.exe (RDP RemoteApp) et de lui passer un paramètre différent à chaque fois. Le paramètre est dans le lien, par exemple: dynamics://0/?DrillDown_478/

Pour passer un paramètre via RDP, je dois utiliser l'option remoteapplicationcmdline. Pour ceci, je vais utiliser un script PowerShell qui va copier mon gabarit et ensuite ajouter le paramètre au fichier temporaire et finalement appeler le fichier RDP temporaire.

1 - Copie le gabarit
2 - Ajoute remoteapplicationcmdline dans le fichier temporaire
3 - Lance le fichier temporaire
4 - Supprime le fichier temporaire


[CmdletBinding()]
param (
[string]$param
)
$guid = [GUID]::NewGuid()
$rdpFile ="AxHlink_"+$guid+".rdp"
Copy-Item \\SERVER\AXConfigurationFiles\Tools\AxHLink_Template.rdp \\SERVER\AXConfigurationFiles\Tools\$rdpFile
Add-Content \\SERVER\AXConfigurationFiles\Tools\$rdpFile "`r`nremoteapplicationcmdline:s:$param"
Invoke-Item \\SERVER\AXConfigurationFiles\Tools\$rdpFile
Start-Sleep -Seconds 90
Remove-Item \\SERVER\AXConfigurationFiles\Tools\$rdpFile -Recurse

Et voilà, c'est un peu complexe, mais ça fonctionne bien.

Dynamics AX : The working folder is already in use by the workspace

Lorsque vous configurez Dynamics AX afin d'utiliser Version Control avec Team Foundation Server, Visual Studio crée un workspace privé dans TFS. Lorsqu’un utilisateur, autre que le propriétaire du workspace TFS, ouvre le client Dynamics AX, il reçoit le message d’erreur suivant:

The working folder C:\FolderName is already in use by the workspace PCNAME_AXWORKSPACE;username on computer PCNAME




Ce message d’erreur m’a forcé à faire plus de recherche sur la configuration des workspaces.

Tout d’abord, j’ai voulu voir la liste de workspace associer à la machine. Pour ce faire, vous pouvez utiliser l’outil ts workspace en ligne de commande. L’outil se trouve dans le dossier suivant:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE

Voici la commande afin de voir tous les workspaces associés à une machine:

tf workspaces /computer:PCNAME /owner:* /collection:http://tfsserver:8080/tfs/CollectionName/


Selon le message d’erreur, je sais que le workspace utilisé par Dynamics AX est DEV-PC3_AXWORKSPACE3. Donc, j’aimerais supprimer tous les autres workspaces. Pour ce faire, je dois supprimer les workspace un par un en utilisant la commande suivante:

tf workspace /delete WORKSPACE;domain\username /collection:http://tfsserver:8080/tfs/CollectionName/


S'il y a beaucoup de workspaces, vous pouvez aussi utiliser Visual Studio pour les supprimer. Au final, il me reste un seul workspace associé à ma machine:


Afin de résoudre mon problème d'accès, je vais changer les permissions du workspace associé à Dynamics AX. 

tf workspace /collection:http://tfsserver:8080/tfs/collectionname/ WORKSPACE;domain\username

Je confirme que mon DEV-PC3_AXWORKSPACE est associé au workspace local qui est configuré dans AX.




Cliquer sur Advanced. C'est ici que vous pouvez modifier les permissions du workspace

Private: Only the owners can use, check in files to, or administer the workspace.

Public Limited: Any valid user can use the workspace. However, only the owners can check in files to or administer the workspace.

Public: Any valid user can use, check in files to, or administer the workspace.


Personnellement, je le configure à public limited. Les autres utilisateurs qui utilisent l'environnement AX peuvent accéder au workspace, mais sans pouvoir faire des check-ins. Donc, je n'ai plus d'erreurs d'accès lorsque les autres utilisateurs ouvrent AX.

Je change le propriétaire du workspace lorsqu'un nouveau développeur prend possession de la machine de développement.

Sources: 

DynamicsPerf : Purger les données

Plusieurs administrateurs de système utilisent l’outil DynamicsPerf pour monitorer les performances de leur système Dynamics AX. Plusieurs d’entre nous se retrouvent avec la base de données DynamicsPerf énorme.

Comment purger-les données ? Les recherches nous mènent à ce blogue:

What’s New in DynamicsPerf 2.0 Release Candidate 0 sous la section Additional Options for controlling the size of the DynamicsPerf database.

Le blogue nous explique comment contrôler la grosseur de la table query plans. Toutefois, le mal est fait dans mon cas, la table est trop grosse et je dois purger les données.

Voici une requête qui vous permet de savoir le nombre de lignes par mois ainsi que son pourcentage d’allocation dans la table:

USE [DynamicsPerf]

SELECT YEAR(DATE_UPDATED) AS Year,
MONTH(DATE_UPDATED) AS Month,
Count(*) AS [Number of Records],
(Count(*)* 100 / (SELECT Count(*) FROM query_plans)) AS Percentage
FROM query_plans
GROUP BY YEAR(DATE_UPDATED),
MONTH(DATE_UPDATED)
ORDER BY Year ASC, Month ASC


Dans mon cas, je veux supprimer les données plus anciennes que juillet 2016. Ceci représente 728 643 lignes.

Il est important de ne pas supprimer toutes les lignes en une seule transaction. Ceci aurait pour conséquence de prendre des heures à finir et le fichier de log SQL deviendrait énorme. Il est mieux de faire une boucle afin de supprimer les lignes.

Avant de commencer l’opération, il faut configurer le  Recovery Model de la base de données à SIMPLE


Ensuite, vous pouvez purger les données avec la requête suivante;

USE [DynamicsPerf]

WHILE EXISTS (SELECT 1 FROM query_plans WHERE DATE_UPDATED < '2016-07-01 00:00:00.000')
BEGIN
    DELETE TOP (1000) FROM query_plans WHERE DATE_UPDATED < '2016-07-01 00:00:00.000'
END;

Vous pouvez aussi configurer une tache planifier afin de supprimer les données plus ancienne qu'un mois:

USE [DynamicsPerf]

WHILE EXISTS (SELECT 1 FROM query_plans WHERE DATE_UPDATED < DATEADD(mm,-1,GETDATE()))
BEGIN
    DELETE TOP (1000) FROM query_plans WHERE DATE_UPDATED < DATEADD(mm,-1,GETDATE())
END;

Ensuite, vous pouvez réduire la taille de votre base de données:

Dynamics AX : Contourner le système d'équilibrage de charge

Dans un environnement multi-aos configurer dans un cluster, il peut être difficile d'établir une connexion avec un AOS particulier. En effet, lorsque le serveur fait partie d'un cluster, le mécanisme interne balance les connexions entre les membres du cluster. Ainsi, il se peut que vous deviez ouvrir une multitude de clients afin d'être redirigé sur le serveur dont vous voulez.

Toutefois, il est possible de configurer le client afin de contourner le système d'équilibrage de charge. Il suffit d'utiliser la commande -internal -loadbalance=0 dans la configuration du client.




Dynamics AX 2012 : You do not have privileges to deploy to server

Vous recevez le message d'erreur suivant lorsque vous déployez un rapport SSRS à partir de l'AOT:

The deployment was aborted. You do not have privileges to deploy to server: servername. For deployment, you must have administrative rights to the SQL Server Reporting Services (SSRS) server. Contact your administrator to deploy.

Voici les solutions: https://technet.microsoft.com/en-us/library/gg724094.aspx

  • Il n'est pas nécessaire de désactiver UAC, vous pouvez simplement ouvrir le client AX avec les droits élevés (Run As Administrator)
  • Le service Remote Registry doit être démarré sur le serveur SSRS
  • L'utilisateur doit être local administrateur sur la machine SSRS

Dynamics AX : SSRS Authentification Persistance

Une configuration SSRS Scale Out deployment peut amener son lot de problèmes. J'ai déjà écrit au sujet de l'erreur HTTP status 401: Unauthorised. Ici, je parle du même problème, mais d'un scénario différent.

Dans ce cas-ci, le client AX envoie deux requêtes, la première requête fonctionne et la deuxième requête échoue. Par exemple, lorsque l'utilisateur imprime un rapport SSRS sur une imprimante réseau, la première requête est envoyée afin d'obtenir le rapport SSRS et une deuxième requête afin de faire l'impression sur une imprimante réseau.


Plusieurs choses ici entrent en ligne de jeu. Tout d'abord, le load balancer est configuré avec une affinité de type COOKIEINSERT. Ceci veut dire qu'un cookie est placé dans la première requête, ainsi les paquets réseau subséquents de la même requête sont redirigés au même serveur SSRS.

Ensuite, le load balancer est configuré en Round Robin, donc la première requête est envoyée au premier serveur et la deuxième requête au second serveur SSRS.

La question à laquelle je me suis longtemps posé est: pourquoi le client n'effectue pas une authentification lors de la deuxième requête.

La réponse est: parce que ce sont deux requêtes envoyées lors de la même connexion. 

Ceci dit, vous avez donc trois solutions.

1 - Changer le mode d'affinité de COOKIEINSERT à SOURCEIP. Ainsi, la deuxième requête, qui vient de la même adresse IP, va être redirigée au même serveur SSRS. À ne pas faire si vous utilisez un Proxy ou un seul serveur RDS pour tous vos clients AX.

2 - Authentification Persistance. Cette configuration force le client à s'authentifier à chaque requête au lieu de chaque connexion. Cette solution ajoute du trafic réseau.

This property controls whether the report server requires authentication for each client request or only once per connection. By default, the EnableAuthPersistance property is set to True in the RSReportServer.config file. This setting applies the security context of the client's first request to each subsequent request. However, if your environment includes a proxy server that sends requests from multiple users as a single connection, you should disable this property by setting its value to False. Disabling it forces the report server to authenticate each request individually.

3 - Kerberos

Dynamics AX : Operation is not valid due to the current state of the object.

Sur mes serveurs SSRS, je n'étais pas capable de supprimer un rapport. Le message d'erreur suivant apparaît:

Operation is not valid due to the current state of the object.




Afin de corriger la situation, j'ai modifié le fichier C:\Program Files\Microsoft SQL Server\MSRS12.MSSQLSERVER\Reporting Services\ReportManager\Web.config

J'ai ajouté la clé suivante dans la section <appSettings>

<add key="aspnet:MaxHttpCollectionKeys" value="1500"/>


Ensuite, il faut redémarrer le service SSRS.

Dynamics AX : EntireCache Tables

Voici un problème intéressant que j'ai eu dernièrement.

L'équipe de migration de données utilise un outil maison pour copier la configuration d'une compagnie vers une autre. L'outil est très simple, il suffit d'indiquer la compagnie source, la compagnie destination et les tables que vous voulez copier. Le tout est exécuté dans un batch.

Après quelques minutes, le message d'erreur suivant apparaît dans le journal d'événement du serveur AOS:

Object Server 01:  Dialog issued for client-less session 5: Cannot create temporary file: C:\Users\SVC_AXAosProd\AppData\Local\Temp\$tmp00050000.$$$.



Je confirme que le disque n'est pas plein.

Après une dizaine de minutes, le service AOS crash:

The Microsoft Dynamics AX Object Server 6.3$01-MicrosoftDynamicsAX service terminated unexpectedly.  It has done this 1 time(s).

Heureusement, j'avais configuré le dump automatique de la mémoire du service AOS. Je prends mon dump et je l'upload dans LCS et je l'analyse avec l'outil Crash and Hang Analysis

J'anticipais voir du code maison, mais ce ne fut pas le cas. En fait le crash semble être lié au kernel. Wow.

Ax32Serv!readPage
Ax32Serv!getPage
Ax32Serv!ServerReadPage


Je jette un coup d'oeil un dossier temporaire qui se trouve sur le serveur AOS et j'y trouve plus de 1000 fichiers. Donc, ce n'est pas un problème d'accès.


Qu'est ce qu'un fichier $tmp*.$$$ ?

Il est possible de mettre des tables AX dans le cache mémoire du serveur AOS. La grosseur limite de la table est de 96 KB. Si la table est plus grosse que la limite, le mémoire déborde sur le disque (spilling to disk). Lorsque la mémoire déborde sur le disque, l'AOS mets les données dans des fichiers temporaires $tmp*.$$$.

Heureusement, j'avais DynamicsPerf d'installer dans mon environnement. J'ouvre le projet DynamicsPerf et j'exécute le requêté: TOO_BIG_FOR_ENTIRE_TABLE_CACHE, Find tables that have entire table cache enabled that are large than 128 KB causes the cache to overflow to disk on the AOS serveur

Voici le résultat:


Pour votre information, 96K = 12 pages. J'ai des tables 138 fois trop grosses pour être mise en cache ! Je demande à l'utilisateur quelle table il tente de copier et sans surprise c'était LEDGERINTERCOMPANY !

J'ai changé la propriété CacheLookup de table LedgerInterCompany et la copie à fonctionner sans faire crasher le service AOS !


Dynamics AX 2012 : The REFERENCES permission was denied on the object 'DATAAREA'

La version CU14 de Management Reporter semble avoir bogue lors de la création de la Data Mart. L'intégration ne démarrait pas et les messages d'erreur suivants sont apparus dans le journal d'événements "DataMart Intégration": 

The REFERENCES permission was denied on the object 'DATAAREA', database 'MicrosoftDynamicsAX',schema 'dbo'. Rolling back transaction. 

 The REFERENCES permission was denied on the object 'VIRTUALDATAAREALIST', database 'MicrosoftDynamicsAX',schema 'dbo'. Rolling back transaction. 

 The REFERENCES permission was denied on the object 'DIRPARTYTABLE', database 'MicrosoftDynamicsAX', schema 'dbo'. Rolling back transaction.

CREATE VIEW permission denied in database 'MicrosoftDynamicsAX'.
Rolling back transaction.

Il faut manuellement configurer les permissions sur la base de donner transactionnels d'AX. Prenez note qu'il faut assigner les permissions au compte d'intégration et non au compte du service.

USE [MicrosoftDynamicsAX]
GO
GRANT REFERENCES ON [dbo].[DATAAREA] TO [DOMAIN\prodmrint]
GRANT REFERENCES ON [dbo].[VIRTUALDATAAREALIST] TO [DOMAIN\prodmrint]
GRANT REFERENCES ON [dbo].[DIRPARTYTABLE] TO [DOMAIN\prodmrint]
GRANT CREATE VIEW TO [DOMAIN\prodmrint]
GO

Dynamics AX 2012: Could not load file or assembly or one of its dependencies. The system cannot find the file.

Lors du déploiement des rapports SSRS, le message d'avertissement est apparu:

WARNING: Parts of the reports deployment failed because one or more business logic assemblies was not available. Make sure all referenced business logic assemblies exist in the Microsoft Dynamics AX client Application Object Tree.

Il est fort probable que le déploiement d'au moins un rapport échoue avec une erreur similaire: 

Error while loading code module: 'ReportName.BusinessLogic, version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Details: Could not load file or assembly or one of its dependencies. The system cannot find the file. 

Le sommaire devrait ressembler à ceci;


Le problème c'est que le design a besoin de l'assembly pour pouvoir être déployé. Mais comme le message d'avertissement du début l'indique, l'assembly n'est pas disponible dans l'AOT.

C:\Program Files\Microsoft SQL Server\MSRS12.MSSQLSERVER\Reporting Services\ReportServer\bin

Pour corriger le problème, vous devez être sûr de voir l'assembly dans le Projet Output dans le C-Sharp Projet du rapport. Ensuite, vous pouvez redéployer le rapport.



SQL : taille d'unité d'allocation 4KB vs 64KB

Je suis en milieu d’implantation d'un système Dynamics AX 2012 R3 pour un de nos clients. On m’a récemment remis une machine virtuelle pour le serveur SQL. Lorsque je reçois un serveur SQL, je vérifie toujours la configuration des disques et j’effectue des tests de performance. 

Je m’aperçois que les disques sont configurés avec des blocs de 4KB. Il est clair que Microsoft recommande de formater les disques en 64KB pour des raisons de performance.



Avant d’envoyer un courriel à mon client pour lui dire que les disques doivent être configurés avec des blocs de 64KB, je décide de faire des tests de performance afin de démontrer qu’il y a un gain de performance entre 4KB et 64KB.

À ma grande surprise, les tests n'indiquent AUCUN gain de performances. Voici mes tests :

64K = Lecture de blob de 64KB
1T, 4T, 8T = Nombre de thread
O32 = Queue Depth de 32
W0, W25 = Pourcentage en ecriture

Lors de mes tests, je désactive la cache logicielle et matérielle. La lecture et écriture est faite de façon aléatoire (non séquentielles)

Voici le tableau des résultats :

Disque avec taille d'unité d'allocation de 4KB


Disque avec taille d'unité d'allocation de 64KB



Je m’attendais à voir plus d'IOPs et une latence moins élever pour le disque configuré avec des blocs de 64 KB. Tout simplement parce que je me disais qu'il est plus rapide de lire 64 KB d'information lorsque le système doit lire seulement un bloc 64 KB. En revanche, lire 64 KB d’information lorsque le disque est formater avec des blocs de 4 KB requiert la lecture de 16 blocs au disque, donc plus d'opérations physiques (mouvement des têtes) et par conséquent une plus longue latence.

Donc, pourquoi les chiffres ne démontrent-ils aucune différence entre 4 KB et 64 KB ? J’en suis venu à la conclusion logique que les performances sont les mêmes puisque c'est un disque virtuel. Le disque est placé dans un VMFS formater avec des blocs de 1 MB. Donc, il y a très peu d'impact au niveau des disques physiques.

Ainsi, j'imagine que les performances sont meilleures seulement lorsque les disques sont RAW.

Toutefois, ma question est : pourquoi Microsoft recommande de formater les disques en 64 KB pour SQL même sur les machines virtuelles ? Sûrement parce que ça ne fait pas de mal.

SQL : DBCC CHECKDB last execution

Voici une requête que j'aime bien utiliser afin de savoir la dernière exécution de DBCC CHECKDBD pour chaque base de données

DECLARE @name VARCHAR(256)

CREATE TABLE #dbinfo
(ParentObject varchar(100),
Object varchar(100),
Field varchar(100),
Value varchar(100))

CREATE TABLE #dbinforesults
(dbname varchar(256),
LastRanDate datetime,
Status varchar(100),
DataPurityCheckEnabled varchar(3))

DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE state_desc='ONLINE'

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN

INSERT INTO #dbinfo
EXEC('DBCC DBINFO (['+@name+']) WITH TABLERESULTS')

INSERT INTO #dbinforesults (dbname, LastRanDate, Status)
(SELECT DISTINCT @name as dbname, Value as LastRanDate,
CASE
WHEN Value = '1900-01-01 00:00:00.000' THEN CONVERT(nvarchar (50),'BAD! DBCC CHECKDB Never Executed')
WHEN DATEDIFF(d, Value, GETDATE()) > 14 THEN CONVERT(nvarchar (50),'BAD! DBCC CHECKDB last execution more than 14 days ago')
ELSE CONVERT(nvarchar(50),'OK! DBCC CHECKDB last execution less than 14 days ago')
END AS Status
FROM #dbinfo
WHERE Field='dbi_dbccLastKnownGood')

UPDATE #dbinforesults SET DataPurityCheckEnabled=(SELECT
CASE
WHEN @name='master' OR @name='model' THEN 'N/A'
WHEN Value=0 THEN 'No'
WHEN Value=2 THEN 'Yes'
END as DataPurityEnabled
FROM #dbinfo
WHERE Field='dbi_dbccFlags')
WHERE dbname=@name

TRUNCATE TABLE #dbinfo

FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor

DROP TABLE #dbinfo
SELECT
dbname AS [Database Name],
LastRanDate AS [Last execution date],
Status AS [Comments],
DataPurityCheckEnabled AS [Data Purity Check Enabled]
FROM #dbinforesults
DROP TABLE #dbinforesults

Résultats

Dynamics AX 2012 : aos.config does not exist

Lors de la modification d'un port AIF dans Dynamics AX, la configuration est aussi sauvegardée localement. Vous pouvez y trouver le fichier de configuration dans le dossier ci-dessous:

C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\Bin\XppIL\AppShare\ServiceGeneration

Ceci ne cause généralement pas de problème dans un environnement avec un seul serveur AOS. 

Il en est autrement dans un environnement multi-aos. Lors de l'activation du port, le fichier de configuration est généré localement sur le serveur AOS.

Ainsi, le message d'erreur suivant survient lorsqu'un autre serveur AOS tente d'utiliser le port

The specified configuration file does not exist: C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\Bin\XppIL\AppShare\ServiceGeneration\PORTNAME\aos.config 

Pour corriger le problème, il suffit de redémarrer le serveur AOS afin que le fichier de configuration soit créé localement, ou de désactiver/activer le port en s'assurant d'être connecté sur le serveur AOS qui ne possède pas le fichier, ou de copier/coller les fichiers d'un serveur AOS qui possède la dernière version vers celui qui n'a pas été mis à jour.

Dynamics AX 2012 : Unable to write the generated WCF configuration to local storage

Voici le message d’erreur que j’ai trouvé sur mon serveur SSRS:

Unable to write the generated WCF configuration to local storage. The generated WCF configuration will be used from memory. The contents of the new configuration are written to the following temp file C:\Users\bcpxy\AppData\Local\Temp\Microsoft.Dynamics.AX.Framework.Services.Client.Configuration.ClientConfigurationInternal.log

Exception datils:
System.ComponentModel.Win32Exception: Access is denied

Pour une raison quelconque, le compte bcproxy essaie de mettre à jour la configuration WCF locale. Dans ce cas-ci, la configuration est sauvegardée dans la base de registres. Si vous voulez conserver la configuration dans la base de registres, il suffit de donner les droits full contrôle au compte BCPROXY sur la clé de registre qui contient la configuration active.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dynamics\6.0\Configuration\Original (installed configuration)


Malheureusement, je ne sais pas ce qui déclenche une mise à jour locale de la configuration WCF. Un rapport peut-être ?

Azure : Désactiver AD Connect Sync

Dans mon laboratoire Azure, j’avais configuré AD Connect afin de synchroniser mes utilisateurs entre Windows Active directory et Azure Active directory.

J’ai éventuellement supprimé mon contrôleur de domaine sans avoir préalablement désactivé la synchronisation. Par conséquent, j'ai commencé à recevoir des notifications comme quoi la synchronisation ne fonctionnait plus.



Comment désactiver la synchronisation si je n’ai plus accès à l’outil AD Connect ?

Tout d’abord, vous devez télécharger et installer Azure Active Directory Module for Windows PowerShell. 

Ensuite, vous devez vous connecter à Azure

$msolcred = get-credential
connect-msolservice -credential $msolcred

Note: Vous devez utiliser un compte cloud (exemple: admin@mtessier.onmicrosoft.com). Vous ne pouvez pas utiliser un compte LiveID ou un compte qui provient de Windows Active Directory.

Ensuite, désactiver la synchronisation:

Set-MsolDirSyncEnabled –EnableDirSync $false

Vous pouvez vérifier le statut de la synchronisation

(Get-MSOLCompanyInformation).DirectorySynchronizationEnabled

Le processus peut prendre jusqu'à 72 heures tout dépendant du nombre d'objets.

Dynamics AX 2012 : Method 'add' in COM object of class 'Documents' returned error

Message d’erreur lors de l’utilisation du Task Recorder avec Microsoft Dynamics AX 2012 R3 et Microsoft Office 2010:

Method 'add' in COM object of class 'Documents' returned error code 0x800A175D (unknown) which means: unknown



Pour corriger l’erreur, il suffit d’ouvrir Microsoft Word et de suivre les étapes suivantes: File > Options > Trust Center > Trust Center Settings > Protected View et désactiver Enable Protected View for files originating from the Internet.


Ensuite, l’erreur suivante est apparue:

Method 'add' in COM object of class 'Documents' returned error code 0x800A1436 (unknown) which means: Sorry, we couldn’t find your file. Is it possible it was moved, renamed or deleted ?


Dans ce cas-ci, assurez-vous d’avoir accès au dossier specifier dans les paramètres

Dynamics AX : Crash and Hang Analysis

Je voulais créer un billet pour mettre en lien deux articles au sujet des crashs d’un serveur AOS. Le premier article est au sujet de l’outil Crash and Hangs Analysis qui se trouve sur le portail LCS. L'outil est bien expliqué dans le blog suivant: Crash and Hang analysis on LCS.

Le deuxième article explique comment collecter le dump: AOS crash, hang or memory leak debugging tools.

Il y a plusieurs exemples selon le problème que vous avez: AOS crashes, AOS Hangs et AOS Memory Leaks.

Prenez note que l’auteur utilise procdump.exe, il est fort probable que vous devez utiliser procdump64.exe si vous utilisez AX 2009 ou 2012.

Le dernier article explique comment collecter les dumps automatiquement: Possibilities to create Memory Dumps from crashing processes

Dynamics AX - Haute disponibilité (Part 3)

Dynamics AX est une solution mature qui vit dans une infrastructure complexe. Il est important de comprendre le rôle de chaque composant et de connaître son importance ou non au sein de l'entreprise. Par exemple, le système d'intégration peut être critique pour une entreprise et moins critique pour une autre. Même chose avec SharePoint et Enterprise Portal, plusieurs entreprises utilisent Enterprise Portal uniquement pour les Roles Center, il n’est peut-être pas nécessaire d'avoir une redondance au niveau des serveurs SharePoint dans ce cas.

Cluster

Un cluster est un groupe de ressource ayant le même but. Les membres d'un cluster se connaissent et partagent leur état. Dans certains cas, les membres d'un cluster se partagent des ressources, généralement le stockage. C'est une technologie couramment utilisée dans le domaine des technologies.

Load Balancing

C'est aussi un groupe de serveur, mais ils sont indépendants et n'échangent pas d'information sur leur état. Le trafic est généralement balancé entre les serveurs. On retrouve souvent cette technlogie avec les services Web, mais il est aussi utilisé dans d'autres contextes.

Solutions

Network - NIC

Network - Switches

Network - Firewall

Dynamics AX - AOS Servers

Dynamics AX - Document Management

Management Reporter
  • Aucune solution HA pour les services Application et Process

SharePoint

Dynamics AX - Haute disponibilité (Part 2)

Dynamics AX - Accord de niveau de service

La disponibilité est toujours un enjeu important des infrastructures Dynamics AX. Avant de pouvoir commencer la planification, il est important d'obtenir l'objectif de disponibilité. Celle-ci est souvent définie par les dirigeants d'entreprises et non par l'équipe des technologies de l'information. Certaines entreprises ont un ou plusieurs SLA internes, il suffit de voir si Dynamics AX peut s'attacher à l'une d'elles. Certaines petites entreprises doivent aller faire leur devoir et déterminer l'objectif de disponibilité. Dans ce cas, il est important de penser au scénario le plus critique pour l'entreprise: l'intégration avec un autre système, la fin de l'année fiscale, la production de produit en saison haute, etc.

Dynamics AX - Maintenance

Certains types d'opération nécessite la planification d'un arrêt d’un ou plusieurs services ou du système en entier. Par exemple, l'importation du code nécessite un redémarrage des services AOS. La reconstruction des index rend la table non disponible pour certaines opérations. Ainsi, il faut aussi tenir compte de cet aspect lors de la planification de la haute disponibilité.

Haute disponibilité, c'est plus que Dynamics AX ! 

Ensuite vient l'évaluation de l'infrastructure existante puisque'il n'y a pas seulement les composants AX qui entrent en jeu ! J'ai fait un petit tableau qui démontre tous les composants inclus dans une architecture Dynamics AX.  Il est important de prendre en considération toute l'infrastructure afin de ne pas avoir un point de défaillance unique.

Dynamics AX : Haute disponibilité (Part 1)

Qu'est-ce qu'un système hautement disponible ?

Les systèmes configurés afin d'offrir une disponibilité presque en tout temps se nomment système hautement disponible. Ces systèmes offrent un taux de disponibilité élevé généralement en se basant sur de la redondance matérielle et applicative. Un système hautement disponible bien configuré n'a pas de point individuel de défaillance (single point of failure). Entre d'autres mots, chaque composant matériel ou applicatif est redondant.

Lorsqu'une panne survient, un basculement des ressources est automatiquement démarré et le système continue d'être opérationnel. Plus le processus est transparent pour les utilisateurs, meilleur est le système de haute disponibilité.

Planification

Lors de la planification de l'architecture d'un système Dynamics AX, il est important de planifier la redondance des serveurs. Il y a deux façons de planifier la haute disponibilité du système:
  • Mettre en place un système de redondance pour chaque composant.
  • Protéger le système contre les multitudes de pannes possibles.

Dans ce billet, je mets l'accent sur la mise en place du système de redondance pour chaque composant.

Mesurabilité

De façon générale, les entreprises utilisent les deux unités de mesure suivante:

  • The mean time to recovery (MTTR) - temps moyen jusqu’à la remise en route.
  • La disponibilité mesurée en pourcentage.

Dans le premier cas, si vous avez un seul serveur AOS et que celui-ci tombe en panne, combien de temps en moyenne vous faudra-t-il afin de remettre le service en route ? Et si le serveur AOS ne démarrait plus et que vous deviez effectuer une restauration ou une nouvelle installation ? Est-ce acceptable pour l'entreprise ?

Dans le deuxième cas, la disponibilité est mesurée en pourcentage. Par exemple, 99.99% veut dire que le système doit être disponible 99.99% du temps pour une période précise, une année par exemple. Dans cet exemple, le système ne sera pas disponible pendant 52 minutes dans une année incluant les pannes planifiées et non planifiées.



Type de panne

Une panne peut être planifiée ou non planifiée. Les pannes non planifiées peuvent être causées par plusieurs facteurs. Par exemple, panne matérielle, panne logicielle, panne électrique, erreur humaine, etc. Les pannes non planifiées perturbent système parce qu'elles sont difficiles à prédire.

Une panne planifiée peut aussi perturber le système, mais elles sont de façon générale plus facile à prévoir et gérer. Les pannes planifiées comprennent la maintenance, les mises à jour du système, les mises à jour du code, etc.

Tolérance aux pannes vs Haute Disponibilité

Lorsqu'un système hautement disponible tombe en panne, le système peut devenir non disponible pour quelques secondes ou minutes. Par exemple, lors d'une panne matérielle sur un host VMware, vSphere détecte la panne et redémarre les machines virtuelles sur un host différent. Le temps du démarrage, le système sera non disponible pour quelques secondes.

Tolérance aux pannes (Fault Tolerance) est un système qui est insensible aux pannes. Pour ce faire, la solution utilise une technologie qui réplique la machine entière incluant la mémoire vive. Par exemple, Fault Tolerance (FT) de VMware.

Ce billet met l'accent uniquement sur des technologies de haute disponibilité.

Dynamics AX 2012 : DIXF Data Lookup ne fonctionne pas

Lors de l'utilisation de DIEF dans un environnement AX 2012 R3, l'utilisateur n'était pas capable de générer le fichier source (generate source file). La fonction data lookup ne fonctionnait tout simplement pas.

La machine utilisée était un system All-in-One Windows 2012 R2 + Office 2010 32 bits + SQL 2014 + AOS + DIXF. C'est ça le problème. SSIS DIXF requiert les driver 64 bits pour Excel.


Il est possible d'installer les driver 64-bits en téléchargeant Microsoft Access Database Engine 2010 Redistributable. Toutefois, puisque Office 32-bit est installé, il est important d'utiliser le paramètre /passive lors de l'installation:

AccessDatabaseEngine_X64.exe /passive




Suite à l'installation, vous allez remarquer que DIXF est maintenant fonctionnel. Toutefois, vous allez réaliser qu'Excel n'est plus dans son état normal, le message d'erreur suivant s'affiche lors de l'ouverture:

One of your object libraries (|) is missing or damaged. Please run Setup to install it.


En effet, l'installation de Microsoft Access Database Engine 64 bits n'est pas compatible avec Office 2012 32 bits comme indiquer dans ce lien.

La bonne nouvelle c'est qu'il existe un truc afin d'avoir Microsoft Access Database Engine 64-bits et Office 32 bits entièrement fonctionnels. Il suffit de supprimer la valeur mso dll dans la clef suivante: 
HKLM\SOFTWARE\Microsoft\Office\14.0\Common\FilesPaths


ATTENTION: avant de faire les modifications ci-haut, il est important de comprendre que les driver 64-bit sont nécessaires sur le serveur SSIS. Demandez-vous pourquoi vous avez besoin d'Office 2010 32 bits sur votre serveur SSIS? Comme dans ce cas-ci, c'est une machine de développement qui comprend tous les components AX ainsi que le client Excel. Toutefois, je conseillerais tout simplement d'utiliser un autre serveur SSIS pour DIXF au lieu de mettre en place une configuration non supportée.

Dynamics AX 2012 : AppFabric Server caching features

Lors de la configuration de mon cluster AppFabric pour Entreprise Portal, j'ai réalisé que tous les services distribution cache étaient éteints. Le journal d'événement me connaît le message d'erreur suivant:

The High Availability feature of AppFabric Server caching features requires all nodes in the cache cluster to be running Windows Server Enterprise Edition or higher.



J'ai effectué mon installation sur des serveurs Windows 2012 R2. La version Entreprise n'existe pas avec Windows 2012. 

Ce problème a été corrigé avec CU4 pour App Fabric 1.1.

Je vous conseille d'installer la plus récente version du CU pour App Fabric. À ce jour, la version Cu7 est disponible ici: https://support.microsoft.com/en-us/kb/3092423.