Je suis actuellement en train de mettre à niveau notre entrepôt de données de SQL 2012 à SQL 2016. J'ai mon ancien et mon nouveau DW fonctionnant côte à côte en parallèle.
Mon processus ETL (un cadre développé dans SSIS par un tiers) a fonctionné avec succès pendant plus de 2 ans en 2012 mais échoue en 2016. Jusqu'à présent, les bases de données et le processus ETL sont identiques.
Les deux serveurs sont des machines virtuelles exécutées sur VMWare. Old Server est Win 2008 avec 24 Go de RAM. SQL 2012 Std. Mem max réglé sur 16 Go. Le nouveau serveur est Win 2012 avec 64 Go de RAM. SQL 2016 dev. Mem max réglé sur 50 Go. Le nouveau DW exécute la version 13.0.1601.5 RTM Developer Edition (64 bits).
Lors de l'exécution de mon processus ETL, les étapes de chargement qui utilisent une fusion SQL dans une dimension ou une table de faits échouent avec l'erreur suivante.
Texte intégral:
DESCRIPTION: Assertion SQL Server: Fichier:, ligne = 951 Échec de l'assertion = 'IS_OFF (BUF_MINLOGGED, m_buf-> bstat) || pageModifyType! = PageModifyType_Contents || GetPagePtr () -> IsTextPage () '. Cette erreur peut être liée au timing. Si l'erreur persiste après la réexécution de l'instruction, utilisez DBCC CHECKDB pour vérifier l'intégrité structurelle de la base de données ou redémarrez le serveur pour vous assurer que les structures de données en mémoire ne sont pas corrompues.
Comme recommandé, j'ai exécuté DBCC et aucune erreur n'a été trouvée. J'ai également redémarré SQL. J'ai ensuite redémarré le processus ETL et j'ai eu la même erreur.
Mes recherches pour cette erreur montrent qu'il s'agissait d'une erreur connue dans SQL 2008, 2012 et 2014 et corrigée dans les correctifs suivants et les mises à jour cumulatives. donc je suis un peu surpris de le voir réapparaître en 2016.
Les liens que j'ai trouvés indiquent que cela affecte SSIS lorsque vous essayez de faire des insertions si la base de données est en modèle de récupération simple ou en bloc. (Je cours dans le modèle de récupération simple)
Une solution de contournement suggérée consiste à remplacer le modèle de récupération Db par FULL. J'ai essayé cela et cela fonctionne, mais ce n'est pas vraiment une solution pour un entrepôt de données.
Est-ce que quelqu'un d'autre a rencontré cela avec 2016?
Quelqu'un peut-il suggérer des solutions alternatives?
Mises à jour:
26/7/2016: J'ai appliqué la mise à jour critique KB3164398 (v13.0.1708.0) et le problème persiste.
27/7/2016: J'ai appliqué la mise à jour cumulative CU1 KB3164674 (v13.0.2149.0).
08/03/2016: Une erreur s'est produite pendant la nuit sur notre plus petit cube. CU1 n'a pas résolu le problème. Aujourd'hui, j'ai signalé le bogue sur MS Connect et j'ai également enregistré un appel de support avec Microsoft.
08/12/2016: MS-Support a répondu initialement, mais les réponses étaient "Nous n'avons pas de correctif pour cela". Le gars du support allait en discuter avec ses collègues et revenir vers moi. 8 jours plus tard, je n'ai pas eu de ses nouvelles.
Bien que je n'aie pas de «solution», nous avons trouvé une solution de contournement qui nous convenait. Voir ma réponse publiée.
29/9/2016. J'ai appliqué CU2 la semaine dernière. Le jeudi, nous avons accidentellement exécuté une ancienne version de la fusion qui a échoué à nouveau avec la même erreur. Donc .. CU2 ne l'a pas corrigé non plus.
23/1/2017 : J'ai appliqué 2016 SP1 CU1 et je crois que cela a résolu le problème. Plus précisément KB3205964
la source
Je crois que cela a été résolu dans 2016 SP1 CU1.
Spécifiquement par KB3205964
la source
Ce problème est résolu en appliquant la mise à jour cumulative 1 (CU1) pour MSSQL2016 voir le lien https://support.microsoft.com/en-us/kb/3164674
la source
Je pense que nous avons trouvé une autre solution. Je poste ma réponse car je pense qu'elle peut être utile, et elle est suffisamment différente de la suggestion de wBob.
Nous avons modifié la partie d'insertion de l'instruction de fusion afin qu'elle soit insérée dans une table temporaire plutôt que dans la cible d'origine.
Une fois l'instruction de fusion exécutée, nous l'insérons ensuite à partir de la table # dans la cible.
Ce n'est pas l'idéal, mais au moins la fusion gère toujours la complexité de l'upsert en marquant les lignes qui ont été retirées / expirées.
Nous avons constaté qu'il s'agissait d'un compromis acceptable par rapport à une réécriture complète de la fusion sous forme d'insertions et de mises à jour distinctes.
la source