PI Services

Le blog des collaborateurs de PI Services

SQL Server : BULK INSERT – Msg 4861 - Operating system error code 5

Problématique

Dans certains cas nous somme amené à utiliser l’instruction BULK INSERT pour injecter dans une table des enregistrements qui proviennent d’un fichier texte stocké sur un partage réseau

Supposons maintenant que nous disposons de 3 serveurs :

  • 1 contrôleur de domaine DC01
  • 2 serveurs SQL 2008 R2 SQL01 et SQL02, le serveur SQL01

Dans le premier scénario nous allons exécuter une requête BULK INSERT sur le serveur SQL01 qui injectera dans la table #TEST les lignes d’un fichier texte nommé ListCustomers.txt accessible via le chemin UNC \\SQL01\FILES\Input

Dans ce premier scénario la requête aboutit sans aucun problème  

image

Dans le deuxième scénario nous allons exécuter une requête BULK INSERT sur le serveur SQL01 mais depuis le serveur SQL02 qui injectera dans la table #TEST les lignes d’un fichier texte nommé ListCustomers.txt accessible via le chemin UNC \\SQL01\FILES\Input

Dans ce deuxième scénario la requête aboutit sans aucun problème

image

Dans le troisième scénario nous allons exécuter une requête BULK INSERT sur le serveur SQL01 mais depuis le serveur SQL02 qui injectera dans la table #TEST les lignes d’un fichier texte nommé ListCustomers.txt accessible via le chemin UNC \\SQL02\FILES\Input

Dans ce troisième scénario une erreur est générée, en effet l’instruction BULK INSERT n’arrive pas à ouvrir le fichier source pour y lire les enregistrements !

image 

Le message complet de l’erreur peut être:

 image

Explication

L’erreur enregistrée dans le scénario 3 est dû au fait que lorsqu’un utilisateur se connecte à SQL Server avec l’authentification Windows il n’est autorisé à lire que les fichiers accessibles par le biais de son compte utilisateurs, quelque soit le profil de sécurité du processus SQL Server.

Résolution

Pour remédier à ce problème on pourra procéder de deux manières, soit qu’on utilise une connexion SQL Server au lieu de l’authentification Windows soit configurer Windows pour activer la délégation des comptes de sécurité.

Pour la configuration de Windows il faudra procéder comme suit :

Supposons  que le compte de service utilisé pour le démarrage du service SQL sur le serveur  SQL01 est SvcSQL01 alors il faudra créer un SPN sur ce compte en utilisant la commande suivante :

SETSPN –A MSSQLSvc/SQL01.domain.lan:1433 DOMAIN\SvcSQL01

Pour vérifier que l’SPN a été bien créé on peut exécuter la commande suivante :

SETSPN –L DOMAIN\SvcSQL01

    image

Une fois le nom principal de service créé il faudra approuver le compte SvcSQL01 à la délégation et le compte de la machine  SQL01 à la délégation, ceci se fait via la console Utilisateurs et Ordinateurs Active Directory

Attention : l’onglet “Delegation” n’apparaitra sur le compte SvcSQL01 qu’après avoir créé le nom principal de servie avec la commande SETSPN 

imageimage

On peut vérifier maintenant que la requête ne gènère plus d’erreur comme le montre la figure suivante.

l’exécution de la requête

SELECT session_id, auth_scheme FROM sys.dm_exec_connections nous permet de confirmer l’authentification utilisé pour nitre session est bien KERBEROS 

image

Remarque

Nous avons pu remarquer que si nous créons le nom principal de service avec le nom de l’instance et non le numéro de port d’une instance nommée l’erreur 4861 persiste, il a fallut fixer le port utilisé par l’instance et l’utiliser pour la configuration du nom principal du service lié au compte de service SQL. 

Quest Resource Updating Manager : The RPC server is unavailable

Introduction

La phase de réacélisation d’un serveur est utile lorsque vous avez migré des comptes ou groupes d’un domaine à un autre. Les ACL d’un dossier sont généralement associé à un groupe, lors du déplacement du groupe dans l’autre domaine, l’ACL n’est pas traduite automatiquement. Pour ce faire on utilise un logiciel tel que Quest Migration Manager, plus exactement Quest Resource Updating Manager pour traiter par lot des serveurs contenant des ACL (serveurs de fichiers par exemple).

Lors de la réacélisation d’un parc de serveurs, j’ai été confronté à l’erreur “The RPC Server is unavailable”. Après avoir longtemps cherché, voici les points clés pour résoudre cette erreur.

Résolution

  1. Réinitialiser le serveur cible depuis la console Quest

Exécutez une tache “Cleanup” sur les serveurs cible impactés par cette erreur. Cela aura pour effet de supprimer l’agent installé automatiquement.

  1. Activer NetBIOS over TCP/IP

Pour ce faire, dans les propriétés de la carte réseau, propriétés TCP/IPv4, Avancée…, onglet WINS, choisissez l’option Enable NetBIOS over TCP/IP.

  1. Les règles de pare-feu pour RPC

Le must est de désactiver le pare-feu le temps du traitement. Si ce n’est pas possible, veillez a ce que les règles Remote Administration (RPC) et Remote Service Management (RPC) soient activées dans le profil de votre carte réseau.

  1. Le service RPC

Démarrez le service Remote Procedure Call (RPC).

  1. Le fichier HOST

Dans le fichier HOST de la machine à traiter, ajoutez l’adresse IP et le nom du serveur Quest.

  1. L’agent

L’installation manuelle de l’agent Quest peut aider. En effet j’ai pu remarquer que l’agent déployé automatique via la tâche Discovery ne se lançait pas. Depuis le serveur à traiter, accédez au dossier d’installation de Quest RUM (C:\Program Files (x86)\Common Files\Aelita Shared\Migration Tools\Resource Updating) et installez le package QsResourceUpdatingAgent.msi. Ne pas oublier de changer le compte de service pour le faire correspondre au compte de service Quest, autrement vous aurez l’erreur Access Denied.

Points de vérification :

  1. Sur le serveur cible, exécutez la commande “nbtstat –a <IP_du_serveur_Quest>”. Vous devez obtenir un résultat. Si vous obtenez “Host not found”, vérifiez les points ci dessous.
  2. Dans la console Quest, lancez la tâche Discovery. Vous devez obtenir un statut OK, sans erreur ni avertissements. Une fois que vous avez le statut OK, lancez la tâche de Processing. Patientez et normalement vous devriez voir la progression et un statut OK une fois la tâche terminée.