Suite

Comment ignorer les erreurs créées par les curseurs parcourant des tables vides ?


J'essaie d'automatiser la création de nombreuses couches d'entités différentes dont le contenu est créé par un curseur. Parfois, pendant l'automatisation, une couche d'entités peut être vide, ce n'est pas grave, mais lorsque le curseur parcourt la couche en ajoutant les données, lede la lignela ligne renvoie l'erreur :

"NameError : le nom 'ligne' n'est pas défini"et arrête le script.

Question : Si une couche que je crée est vide, comment puis-je ignorer les erreurs qui pourraient apparaître en raison de l'incapacité du curseur à se définir dans une table vide ?

Déjà essayé: j'ai essayé de définir une variable 'count' sur le nombre de lignes dans chaque table et de dire à python de sauter la table s'il contient moins d'une ligne, mais la ligne "del row" a toujours causé des problèmes, et j'ai eu du mal à configurer l'instruction try.

Le code ci-dessous renvoie toujours l'erreur. Il n'imprime pas encore le curseur videUNCompteest en effet 0.

curseur = arcpy.da.UpdateCursor("A_Squares", ["LEGEND"]) ACount = arcpy.GetCount_management("A_Squares") print ACount if ACount == 0 : print "curseur vide" else : pour la ligne dans le curseur : ligne[ 0] = TableA cursor.updateRow(row) del row del curseur

Des idées?


La sortie de la méthode GetCount n'est pas entièrement correcte, donc votre instruction if ne suit pas le bon chemin. Utilisez la méthode .GetOutput :

count = arcpy.GetCount_management("A_Squares") ACount = int(count.getOutput(0)) if ACount == 0 : affiche "curseur vide" else : pour la ligne dans le curseur : #… etc

Il n'est peut-être pas complètement nécessaire de supprimer l'objet de ligne, mais si vous le définissez d'abord, vous devriez être en or.

curseur = arcpy.SearchCursor("whatever") row = None # Définissez-le ici pour la ligne dans iter(cursor.next, None): #… del cursor del row

Combien de temps une table MEMORY temporaire persistera-t-elle si je ne la supprime pas (MySQL)

J'utilise une procédure stockée récursive dans MySQL pour générer une table temporaire appelée id_list , mais je dois utiliser les résultats de cette procédure dans une requête de sélection de suivi, donc je ne peux pas SUPPRIMER la table temporaire dans la procédure.

Lors de l'appel de la procédure, la première valeur est l'ID supérieur de la branche que je veux, et la seconde est le niveau que la procédure utilise lors des récursions. Avant la boucle récursive, il vérifie si tier = 0 et si c'est le cas, il s'exécute :

Alors ma question est : Si je ne supprime pas la table MEMORY temporaire à la fin de la procédure ou dans ma transaction, combien de temps cette table persistera-t-elle en mémoire ? Est-il automatiquement supprimé une fois la session terminée ou restera-t-il en mémoire tant que la connexion est ouverte ?

**N.B. La réponse évidente pourrait être de supprimer la table temporaire avant l'instruction de validation, mais supposons un instant que je ne peux pas le faire.*

ÉDITER: Pour être un peu plus précis, et si des connexions persistantes sont utilisées, la table persistera-t-elle à travers plusieurs requêtes ? Jusqu'à présent, il semble que ce sera le cas et que nous devrons explicitement supprimer la table temporaire pour libérer cette ressource.

METTRE À JOUR: Sur la base des conseils des commentateurs, j'ai trouvé un moyen d'ajuster ma procédure stockée afin que je puisse utiliser la table TEMP MEMORY, mais pouvoir la SUPPRIMER explicitement à la fin.

Plutôt que d'appeler simplement la procédure stockée et d'utiliser la table TEMP restante pour rassembler les résultats dans la requête réelle, j'ai modifié le format CALL pour utiliser une troisième variable OUT comme ceci :

. puis dans la procédure stockée, j'ai ajouté un deuxième niveau IF = 0 à la toute fin avec ce qui suit :

Ainsi, le résultat de la procédure stockée est maintenant une liste d'ID séparés par des virgules compatible avec FIND_IN_SET , et la requête finale a donc été modifiée de sorte que :

Voila ! Merci aux commentateurs pour votre contribution et pour m'avoir donné la raison pour laquelle j'avais besoin d'essayer un peu plus fort :)


2 réponses 2

Est-ce que quelqu'un sait comment faire pour que cela fonctionne?

Ne l'exécutez pas directement à partir du déclencheur. Au lieu de cela, écrivez un travail d'agent pour sauvegarder toute base de données de récupération COMPLÈTE qui n'a pas eu de sauvegarde complète. Cet état est parfois appelé "Pseudo-Simple Recovery", car il se comporte exactement comme une récupération SIMPLE même si le modèle de récupération de la base de données a été modifié en FULL.

Ensuite, exécutez-le toutes les 5 minutes, lancez le travail avec sp_start_job à partir du déclencheur ou intégrez-le dans votre maintenance planifiée afin qu'il s'exécute avant vos sauvegardes de journaux.

ma suggestion est de remplacer votre script par celui qui utilise la solution de sauvegarde ola hallengren avec l'option ChangeBackupType='Y'

Modifiez le type de sauvegarde si une sauvegarde différentielle ou de journal des transactions ne peut pas être effectuée.

DatabaseBackup vérifie différentiel_base_lsn dans sys.master_files pour déterminer si une sauvegarde différentielle peut être effectuée. Si une sauvegarde différentielle n'est pas possible, la base de données est ignorée par défaut. Vous pouvez également définir ChangeBackupType sur Y pour effectuer une sauvegarde complète à la place.

DatabaseBackup vérifie last_log_backup_lsn dans sys.database_recovery_status pour déterminer si une sauvegarde du journal des transactions dans un modèle de récupération complet ou enregistré en bloc peut être effectuée. Si une sauvegarde du journal des transactions n'est pas possible, la base de données est ignorée par défaut. Vous pouvez également définir ChangeBackupType sur Y pour qu'une sauvegarde différentielle ou complète soit effectuée à la place.

Fondamentalement, si vous avez défini ce paramètre sur Y, lorsque le tlog planifié pour toutes les bases de données utilisateur s'exécute, le script effectuera une sauvegarde complète au lieu d'un simple tlog.


Comment ignorer les erreurs créées par les curseurs parcourant des tables vides ? - Systèmes d'information géographique

Client Python pour les implémentations HiveServer2 (par exemple, Impala, Hive) pour les moteurs de requête distribués.

Pour une fonctionnalité Impala de niveau supérieur, y compris une interface de type Pandas sur des ensembles de données distribués, voir le projet Ibis.

Compatible HiveServer2 fonctionne avec Impala et Hive, y compris les données imbriquées

Client Python entièrement compatible DB API 2.0 (PEP 249) (similaire aux clients sqlite ou MySQL) prenant en charge Python 2.6+ et Python 3.3+.

Fonctionne avec Kerberos, LDAP, SSL

Convertisseur en pandas DataFrame , permettant une intégration facile dans la pile de données Python (y compris scikit-learn et matplotlib) mais voir le projet Ibis pour une expérience plus riche

kerberos>=1.3.0 pour la prise en charge de Kerberos sur HTTP. Cela nécessite également l'installation des bibliothèques Kerberos sur votre système - voir Système Kerberos

pandas pour la conversion en objets DataFrame mais voyez plutôt le projet Ibis

sqlalchemy pour le moteur SQLAlchemy

pytest pour exécuter des tests unittest2 pour tester sur Python 2.6

Différents systèmes nécessitent l'installation de différents packages pour activer la prise en charge de Kerberos dans Impyla. Voici quelques exemples d'installation des packages sur différentes distributions.

Installez la dernière version avec pip :

Pour la dernière version (dev), installez directement depuis le dépôt :

impyla utilise la chaîne d'outils pytest et dépend des variables d'environnement suivantes :

Pour exécuter l'ensemble maximal de tests, exécutez

Laissez de côté l'option --connect pour ignorer les tests de conformité de l'API DB.

Impyla implémente l'interface de base de données Python DB API v2.0 (PEP 249) (consultez-la pour plus de détails sur l'API) :

L'objet Cursor expose également l'interface de l'itérateur, qui est mise en mémoire tampon (contrôlée par cursor.arraysize ):

De plus, l'objet Cursor vous renvoie des informations sur les colonnes renvoyées dans la requête. Ceci est utile pour exporter vos données sous forme de fichier csv.

Vous pouvez également récupérer un objet DataFrame pandas

Vous devez d'abord signer et retourner une ICLA et une CCLA avant que nous puissions accepter et redistribuer votre contribution. Une fois ceux-ci soumis, vous êtes libre de commencer à contribuer à impyla. Envoyez-les à [email protected]

Nous utilisons les problèmes Github pour suivre les bogues de ce projet. Trouvez un problème sur lequel vous aimeriez travailler (ou classez-en un si vous avez découvert un nouveau problème !). Si personne ne travaille dessus, attribuez-le à vous-même uniquement si vous avez l'intention d'y travailler sous peu.

C'est une bonne idée de discuter de votre approche prévue sur la question. Vous êtes beaucoup plus susceptible de faire réviser et valider votre patch si vous avez déjà obtenu l'adhésion de la communauté impyla avant de commencer.

Maintenant, commencez à coder ! Pendant que vous écrivez votre patch, gardez les points suivants à l'esprit :

Tout d'abord, veuillez inclure des tests avec votre patch. Si votre patch ajoute une fonctionnalité ou corrige un bogue et n'inclut pas de tests, il ne sera généralement pas accepté. Si vous ne savez pas comment rédiger des tests pour un composant particulier, veuillez demander des conseils sur le problème.

Deuxièmement, veuillez garder votre correctif étroitement ciblé sur le problème décrit par le problème. C'est mieux pour tout le monde si nous maintenons la discipline sur la portée de chaque patch. En général, si vous trouvez un bogue en travaillant sur une fonctionnalité spécifique, signalez un problème pour le bogue, vérifiez si vous pouvez vous l'attribuer et le corriger indépendamment de la fonctionnalité. Cela nous aide à différencier les corrections de bogues et les fonctionnalités et nous permet de créer des versions de maintenance stables.

Enfin, veuillez rédiger un bon message de validation clair, avec un titre court et descriptif et un message suffisamment long pour expliquer quel était le problème et comment il a été résolu.


Script SQL pour supprimer les tables de gestion des immobilisations

De temps en temps, lors d'une mise à niveau ou de l'implémentation d'un module pour un client, nous rencontrons des erreurs lors de la Utilitaires GP mise à niveau de la base de données. Cette fois-ci, nous avons rencontré l'erreur lors de la mise en œuvre de la gestion des immobilisations (FAM) dans Microsoft Dynamics GP 2015 R2.

Nous avions précédemment mis à niveau le client à partir de Dynamics GP 2010 R2 où il n'utilisait pas la gestion des immobilisations et ne l'avait jamais fait. Cependant, bien que la fonctionnalité ne soit pas installée dans Dynamics GP 2010 R2 et que le client ne sache jamais l'avoir utilisé, il y avait des tables pour la gestion des immobilisations dans leurs plus de 20 bases de données d'entreprise, il semble qu'un de leurs partenaires précédents ait fait quelque chose d'étrange quand création de ces sociétés.

La solution dans ce cas était de supprimer toutes les tables de gestion des immobilisations de la base de données. Quand j'ai fait ce genre de chose avant d'avoir écrit manuellement des scripts pour le faire, mais que j'en ai marre de le faire (la fois précédente, je devais le faire, c'était les modules RH.

J'ai donc écrit un script simple à l'aide d'un curseur qui est exécuté sur la base de données système et qui parcourt toutes les bases de données de l'entreprise et génère des scripts de suppression pour toutes les tables du module désigné.

Il génère également des scripts pour supprimer les lignes des tables DU dans la base de données système.

Il y a trois paramètres en haut qui doivent être réglés :

  1. La base de données en haut qui devrait être une base de données système
  2. @PRODID qui est l'identifiant de produit numérique pour FAM ce 309
  3. @TablePrefix qui est le préfixe alpha des noms de table, qui pour FAM est FA

Les paramètres ne sont ni authentifiés ni vérifiés, vous devez donc vous assurer que l'ID du produit et le préfixe de la table sont corrects avant de continuer.

Lorsque le script est exécuté, affichez-le dans Text qui vous donnera une série de commandes DROP TABLE que vous pourrez ensuite vérifier que vous êtes satisfait des scripts avant de les exécuter. Je vous recommande fortement de vérifier les scripts et de les exécuter sur un système de test contenant d'abord une copie de live pour vous assurer que le résultat correspond à vos besoins.


142 questions et réponses d'entretien SQL que vous devez préparer en 2021

Les bases de données relationnelles restent les systèmes de gestion de bases de données les plus largement utilisés. L'accès et l'analyse des données sont les besoins les plus urgents de nos jours et SQL vous permet de faire exactement cela. Il existe une forte demande parmi les employeurs pour les personnes possédant des compétences SQL. Il est donc absolument essentiel que vous vous prépariez aux questions fréquemment posées Questions d'entretien SQL, si vous voulez décrocher le job de vos rêves !

Consultez notre cours gratuit sur les questions d'entretien SQL à Great Learning Academy. Dans ce cours, nous commencerons par des questions d'entretien sur les bases de SQL. Ensuite, nous plongerons dans les questions de Normalisation et de Sous-requêtes. Enfin, nous aurons des questions d'entretien sur deux projets “Broadband management system” et “HR DBMS”. Vous pouvez également suivre le cours de certification d'ingénieur logiciel proposé par Great Learning en collaboration avec des universités de premier plan. Great Learning offre une assistance professionnelle et un soutien de mentor dédié pour vous aider à faire avancer votre carrière.


Dépannage : messages d'erreur courants

Le tableau suivant comprend une liste des erreurs de tâches courantes et leurs causes.

Cela peut se produire lorsque vous avez affecté une tâche ou un flux de tâches à exécuter selon un calendrier avec une fréquence de répétition courte. La tâche (ou la première tâche d'un flux de tâches) est toujours en cours d'exécution lorsque la planification essaie de la redémarrer.   Vous devrez augmenter la fréquence de répétition de la planification.  Une autre possibilité est que la tâche soit suspendu. Pour arrêter une tâche, accédez à la Moniteur d'activité et arrêtez la tâche en cliquant sur le "x" rouge dans le Actions colonne.

Cette erreur signifie que vous avez effectué trop d'appels d'API SFDC sur une période de 24 heures.

Cela peut se produire lorsque 1) la taille du lot (à l'étape 6 de l'assistant de tâche de synchronisation des données) est définie sur moins de 200, ou 2) trop d'appels de recherche à Salesforce s'exécutent trop fréquemment.

Pour ce dernier problème, si vous effectuez une migration initiale de données, vous pouvez envisager de transférer les données de Salesforce dans un fichier plat. Vous pouvez ensuite exécuter la migration en recherchant les données du fichier. Pour une intégration continue, vous pouvez rechercher des données dans Salesforce.


Comment ignorer les erreurs créées par les curseurs parcourant des tables vides ? - Systèmes d'information géographique

Changement important Microsoft Windows : Les builds MySQL sur Windows à l'aide de Visual Studio nécessitent désormais Visual Studio 2013 ou une version ultérieure. L'exigence précédente était Visual Studio 2010 ou version ultérieure. (Bogue #18404381)

Changement important : L'API des opérations atomiques a été simplifiée pour n'utiliser que l'implémentation intégrée de GCC ou les implémentations fournies par la plate-forme (pour Windows, Solaris) et pour supprimer l'implémentation de secours personnalisée basée sur mutex. Les implémentations retenues sont celles capables d'utiliser des atomes natifs du CPU. Cela simplifie les API atomiques et le code associé et traite les bogues résultant de l'implémentation de secours.

Dans le cadre de ce travail, les (non documentés) WITH_ATOMIC_LOCKS et MY_ATOMIC_MODE_RWLOCKS Cfaire les options ont été supprimées.

Sur les plates-formes où les atomes natifs sont pris en charge, ce changement n'introduit aucun problème. Pour les autres plates-formes, voici les problèmes potentiels de compilation MySQL et leurs solutions :

Les variantes Linux 32 bits qui utilisent GCC 4.1 ne fonctionneront plus. Cela inclut Red Hat 5, qui est une plate-forme prise en charge. La solution à ce problème est d'utiliser un nouveau GCC ou de définir l'option de compilateur -march. Par exemple, utilisez GCC 4.4, qui est disponible sur Red Hat 5. Pour plus d'informations sur la spécification des options du compilateur, consultez Compiler Flags.

Il peut y avoir des problèmes sur les plates-formes non prises en charge. Par exemple, PowerPC 64 bits, ARM 32 bits et ARM 64 bits ne seront pas compilés avec des compilateurs plus anciens. La solution pour ces cas est d'utiliser GCC 4.7 ou une version ultérieure.

Cfaire vérifie maintenant les versions minimales des compilateurs pris en charge : gcc 4.4 (Linux, Solaris) Sun Studio 12u2 (bibliothèque cliente Solaris) Clang 3.3 (OS X, FreeBSD). Cette vérification peut être désactivée avec l'option -DFORCE_UNSUPPORTED_COMPILER=ON. (Bogue #19187034)

Les avertissements bruyants du compilateur sur FreeBSD 10 ont été réduits au silence. (Bogue #18790490)

Cfaire les solutions de contournement pour les anciennes versions d'OS X et XCode ont été supprimées. Sous OS X, la compilation utilise toujours Clang, même pour les versions 32 bits.

La compilation sur OS X est désormais prise en charge pour OS X 10.8 et versions ultérieures, en utilisant XCode 5 et versions ultérieures. La compilation sur des versions plus anciennes peut fonctionner mais n'est pas prise en charge. (Bogue #18510941)

Auparavant, le MYSQL_MAINTAINER_MODE Cfaire L'option était activée par défaut pour les versions de débogage et désactivée pour les versions de version, et MYSQL_MAINTAINER_MODE provoquait l'activation de -Werror lors de la construction avec GCC. Cela rendait difficile l'activation de -Werror sous certaines conditions, comme lors de la compilation avec Clang.

Désormais, MYSQL_MAINTAINER_MODE est activé par défaut lors de la compilation des versions de débogage avec GCC, et MYSQL_MAINTAINER_MODE active -Werror, que GCC ou Clang soit utilisé. L'activation de -Werror avec Clang peut être effectuée simplement en définissant explicitement -DMYSQL_MAINTAINER_MODE=1 lors de l'exécution Cfaire . De plus, certains avertissements de compilation signalés par Clang 3.4 ont été corrigés, permettant de construire la version de débogage par défaut avec -Werror . (Bogue #18313717)

Le support de build a été modifié pour produire les mêmes avertissements pour Clang que pour gcc . (Bogue #17959689)

Des travaux ont été effectués pour nettoyer la base de code source, notamment : Cfaire vérifie la suppression des macros inutilisées des fichiers source, la réorganisation des fichiers d'en-tête pour réduire le nombre de dépendances et les rendre plus modulaires, la suppression des déclarations de fonction sans définition, le remplacement des fonctions écrites localement par des fonctions équivalentes des bibliothèques standard de l'industrie.

Remarques sur la configuration

Modification incompatible : mysql_install_db a été réécrit de Perl en C++. Cela lui permet d'être fourni en tant que binaire exécutable et élimine sa dépendance à l'installation de Perl.

La nouvelle implémentation implique également plusieurs autres différences. Les éléments suivants répertorient certains des changements les plus importants. Pour plus d'informations, consultez mysql_install_db — Initialiser le répertoire de données MySQL.

La version binaire exécutable se trouve dans le répertoire d'installation bin, tandis que la version Perl se trouve dans le répertoire d'installation des scripts. Pour les mises à niveau à partir d'une ancienne version de MySQL, vous pouvez trouver une version de mysql_install_db dans les deux répertoires. Pour éviter toute confusion, supprimez la version du répertoire des scripts. Pour les nouvelles installations de MySQL 5.7.5 ou version ultérieure, mysql_install_db se trouve uniquement dans le répertoire bin et le répertoire scripts n'est plus présent. Les applications qui s'attendent à trouver mysql_install_db dans le répertoire des scripts doit être mis à jour pour regarder dans le répertoire bin à la place.

Certaines options sont gérées différemment. Par exemple, l'option --datadir est obligatoire.

Il y a plusieurs nouvelles options. Par exemple, il existe des options qui permettent un contrôle explicite sur le compte administratif qui est créé. Par défaut, il s'agit de 'root'@'localhost' , mais vous pouvez utiliser --admin-user et --admin-host pour modifier les parties utilisateur et hôte du nom de compte.

Plusieurs options ont été supprimées ou remplacées. Par exemple, --skip-random-passwords a été remplacé par --insecure .

mysql_install_db écrase toujours le fichier .mysql_secret, plutôt que de l'ajouter s'il existe. Il est supposé qu'immédiatement après l'installation, vous vous connecterez au serveur à l'aide du contenu du fichier et réinitialiserez le mot de passe administratif avant de procéder à un autre déploiement.

mysql_install_db ne transmet plus d'options non reconnues à mysqld . (Mais vous pouvez utiliser --defaults-extra-file pour spécifier un fichier d'options à ajouter au mysqld commande d'amorçage.)

mysql_install_db ne crée plus de fichier my.cnf par défaut.

Prise en charge de DTrace

MySQL inclut désormais la prise en charge de DTrace sur Oracle Linux 6 ou supérieur avec le noyau UEK. Si DTrace est présent, les versions du serveur le détecteront sans Cfaire options requises. Pour plus d'informations sur l'utilisation de DTrace sur MySQL, consultez Traçage de mysqld à l'aide de DTrace.

La gestion des erreurs

Le serveur a été rendu plus cohérent et résilient en ce qui concerne le traitement des instructions pour lesquelles le mot-clé IGNORE est spécifié.

Le serveur n'a pas réussi à signaler les avertissements pour les instructions INSERT IGNORE.

Le serveur peut ne pas signaler les avertissements pour les instructions DELETE IGNORE à plusieurs tables.

Les déclencheurs UPDATE pour une table étaient invoqués même pour les instructions UPDATE IGNORE pour lesquelles un index unique provoquait l'ignorance de la mise à jour.

Pour les versions de débogage, une assertion peut être déclenchée pour les erreurs se produisant dans les instructions DELETE IGNORE.

Pour les versions de débogage, une assertion peut être déclenchée pour les interblocages résultant des instructions DELETE IGNORE.

Pour DELETE IGNORE exécuté sur la table parent dans une relation de clé étrangère, les erreurs de violation de clé étrangère ont été traitées comme des avertissements (corrects), mais les lignes qui n'ont pas produit de violations de clé étrangère n'ont pas été supprimées.

Le serveur a été rendu plus cohérent et résilient en ce qui concerne le traitement des instructions en mode SQL strict.

En mode SQL strict, les déclencheurs pourraient permettre des opérations non autorisées en mode strict.

En mode SQL strict, les avertissements d'obsolescence concernant les index en double étaient incorrectement promus en erreurs.

Le mode SQL strict n'était pas appliqué aux instructions DELETE à plusieurs tables.

Pour plus d'informations sur IGNORE et le mode SQL strict, consultez Comparaison du mot-clé IGNORE et du mode SQL strict. (Bogue #6196, Bogue #11744960, Bogue #43895, Bogue #11752648, Bogue #68726, Bogue #16522924, Bogue #16860715, Bogue #16860829, Bogue #14786621, Bogue #17550423, Bogue #42910, Bogue #11751889, Bogue #16976939, bogue #18526888)

Remarques sur InnoDB

Modification incompatible : Le moteur de stockage InnoDB ne peut plus être désactivé. L'option --skip-innodb est obsolète et n'a aucun effet, et son utilisation entraîne un avertissement. Il sera supprimé dans une future version de MySQL. Cela s'applique également à ses synonymes ( --innodb=OFF , --disable-innodb , etc.).

Un nouvel indicateur innodb_lock_no_retry pour l'option --debug est désormais disponible. --debug='d,innodb_lock_no_retry' fait échouer InnoDB immédiatement au démarrage si les verrous ne peuvent pas être acquis, plutôt que de faire 100 tentatives avant d'échouer. Cela peut être utile pendant les tests ou le débogage pour produire une sortie de serveur plus rapide lorsqu'InnoDB ne peut pas acquérir ses verrous.

L'une des raisons de la désactivation d'InnoDB est d'activer le démarrage d'une instance de serveur en utilisant le même répertoire de données qu'une instance existante. (MyISAM le permet, mais pas InnoDB.) Comme InnoDB ne peut plus être désactivé, la solution de contournement consiste à arrêter l'instance existante avant d'en démarrer une autre afin qu'il n'y ait qu'une seule instance active utilisant un répertoire de données à la fois.

Modification incompatible : Un nouveau type d'enregistrement de journal ( MLOG_FILE_NAME ) est utilisé pour identifier les tablespaces fichier par table qui ont été modifiés depuis le dernier point de contrôle. Cette amélioration simplifie la découverte des tablespaces lors de la récupération sur incident et élimine les analyses sur le système de fichiers avant de refaire l'application du journal. Pour plus d'informations sur les avantages de cette amélioration, consultez Découverte d'espace disque logique pendant la récupération sur incident.

Cette amélioration modifie le format du journal redo, nécessitant que MySQL soit arrêté proprement avant de mettre à niveau ou de rétrograder à partir de MySQL 5.7.5.

Remarques sur l'optimiseur

L'optimiseur calcule des coûts plus précis pour la matérialisation des semi-jointures. (Bogue #18558561)

La sortie de trace de l'optimiseur pour l'accès à la plage dans la section consider_access_path a été améliorée : au lieu de toujours afficher "access_type": "ref" pour les types de recherche d'index, "eq_ref" , "ref" ou "fulltext" est maintenant imprimé. (Bogue #18195373)

Lors de la construction du plan d'exécution de la requête, l'optimiseur peut désormais utiliser le filtrage des conditions pour mieux utiliser les conditions d'une table en estimant le nombre de lignes qualifiées à joindre à la table suivante. Par exemple, même s'il peut y avoir une méthode d'accès basée sur un index qui peut être utilisée pour sélectionner des lignes de la table actuelle dans une jointure, il peut également y avoir des conditions supplémentaires pour la table dans la clause WHERE qui peuvent filtrer (restreindre davantage) le estimation des lignes éligibles passées à la table suivante.

Pour contrôler si l'optimiseur prend en compte des conditions de filtrage supplémentaires, utilisez l'indicateur condition_fanout_filter de la variable système Optimizer_switch. Cet indicateur est activé par défaut mais peut être désactivé pour supprimer le filtrage des conditions (par exemple, si une requête particulière s'avère offrir de meilleures performances sans lui).

L'optimiseur utilise désormais des statistiques d'index plus exactes. Actuellement, les valeurs améliorées sont utilisées par InnoDB , avec ces effets :

Dans de nombreux cas, de meilleurs plans d'exécution sont obtenus pour les requêtes pour lesquelles un join index ou un ordre de jointure de table moins optimal a été choisi auparavant.

Les estimations de ligne dans la sortie EXPLAIN sont plus précises, ainsi que les valeurs de filtre dans certains cas.

Les estimations de cardinalité dans les statistiques d'index affichées par SHOW INDEX sont plus précises pour les tables InnoDB.

Pour générer des plans d'exécution, l'optimiseur utilise un modèle de coût basé sur des estimations du coût de diverses opérations qui se produisent pendant l'exécution de la requête. L'optimiseur dispose d'un ensemble de « constantes de coût » compilées par défaut pour prendre des décisions concernant les plans d'exécution.

L'optimiseur dispose désormais également d'une base de données d'estimations de coûts à utiliser lors de la construction du plan d'exécution. Ces estimations sont stockées dans les tables server_cost et engine_cost dans la base de données système mysql et sont configurables à tout moment : Toute estimation de coût non NULL stockée dans les tables du modèle de coût remplace l'estimation par défaut compilée correspondante. Toute estimation NULL indique à l'optimiseur d'utiliser la valeur par défaut compilée.

La mise en œuvre et les tests sont en cours pour permettre aux administrateurs de base de données de modifier ces valeurs en toute sécurité. Actuellement, leur modification doit être envisagée à vos risques et périls.

Il existe également une nouvelle variante FLUSH, FLUSH OPTIMIZER_COSTS , qui oblige le serveur à relire les tableaux de coûts et à appliquer les estimations modifiées aux nouvelles sessions.

Si vous effectuez une mise à niveau vers cette version MySQL à partir d'une version antérieure, vous devez exécuter mysql_upgrade (et redémarrez le serveur) pour incorporer ces changements dans la base de données mysql.

Remarques sur le schéma de performances

Modification incompatible : Le schéma de performances fournit désormais une table user_variables_by_thread qui expose les variables définies par l'utilisateur. Pour plus d'informations, consultez Tableaux de variables définies par l'utilisateur du schéma de performances.

En conséquence de ce changement, le serveur limite désormais les noms de variables définis par l'utilisateur à un maximum de 64 caractères, la longueur de la colonne VARIABLE_NAME dans la table. Auparavant, le serveur n'appliquait pas de limite. La nouvelle limite est similaire à la limite de longueur de nombreux autres identifiants dans MYSQL (voir Variables définies par l'utilisateur). Les requêtes qui utilisent des noms de variables définis par l'utilisateur très longs doivent être réécrites en noms plus courts par l'utilisateur.

Si vous effectuez une mise à niveau vers cette version MySQL à partir d'une version antérieure, vous devez exécuter mysql_upgrade (et redémarrez le serveur) pour incorporer cette modification dans la base de données performance_schema.

Auparavant, pour les tables d'événements d'attente (telles que events_waits_current ), la colonne NUMBER_OF_BYTES était NULL pour les attentes d'E/S de table, c'est-à-dire pour les événements de l'instrument wait/io/table/sql/handler. Pour les attentes d'E/S de table, cette valeur indique désormais le nombre de lignes traitées.

De plus, pour les opérations d'E/S par lots (telles que les extractions de lignes pour les analyses de table ou d'index), le schéma de performances peut désormais signaler un événement unique pour N lignes, plutôt que de signaler un événement sur une seule ligne N fois. Cette modification réduit considérablement la surcharge du schéma de performances pour les E/S par lots de table en réduisant le nombre d'appels de rapport. Le compromis est une précision moindre pour la synchronisation des événements. Plutôt que le temps pour une opération de ligne individuelle comme dans les rapports par ligne, le temps pour les E/S par lots inclut le temps passé pour des opérations telles que la mise en mémoire tampon de jointure, l'agrégation et le renvoi de lignes au client.

Pour plus d'informations sur les conditions dans lesquelles le rapport d'E/S par lots se produit, consultez la description de la colonne NUMBER_OF_BYTES dans la table events_waits_current.

Les tables d'événements d'étape du schéma de performances ( events_stages_current , events_stages_history et events_stages_history_long ) contiennent deux nouvelles colonnes qui, prises ensemble, fournissent un indicateur de progression d'étape pour chaque ligne :

WORK_COMPLETED : nombre d'unités de travail terminées pour l'étape

WORK_ESTIMATED : nombre d'unités de travail attendues pour l'étape

Chaque colonne est NULL si aucune information de progression n'est fournie pour un instrument. L'interprétation de l'information, si elle est disponible, dépend entièrement de la mise en œuvre de l'instrument. Initialement, pour démontrer le concept, l'instrument de table stage/sql/copy to tmp fournit des informations sur la progression s'il est activé. Dans ce cas, l'unité d'interprétation des colonnes est le nombre de lignes copiées.

Si vous effectuez une mise à niveau vers cette version MySQL à partir d'une version antérieure, vous devez exécuter mysql_upgrade (et redémarrez le serveur) pour incorporer cette modification dans la base de données performance_schema.

Notes de sécurité

Modification incompatible : Mots de passe obsolètes MySQL 5.6 qui utilisaient l'ancien format de hachage de mot de passe antérieur à 4.1. La prise en charge de ces mots de passe est désormais supprimée, ce qui implique les modifications suivantes. Les applications qui utilisent une fonctionnalité qui n'est plus prise en charge doivent être modifiées.

Le plugin d'authentification mysql_old_password côté serveur est supprimé. Les comptes qui utilisent ce plugin sont désactivés au démarrage et le serveur écrit un message « plugin inconnu » dans le journal des erreurs. Pour obtenir des instructions sur la mise à niveau des comptes qui utilisent ce plug-in, consultez Migrating Away from Pre-4.1 Password Hashing et le plug-in mysql_old_password.

Le plugin d'authentification mysql_old_password côté client est supprimé de la bibliothèque cliente C.

L'option --secure-auth pour les programmes serveur et client est la valeur par défaut, mais est maintenant un no-op. Il est obsolète et sera supprimé dans une future version de MySQL.

L'option --skip-secure-auth des programmes serveur et client n'est plus prise en charge et son utilisation génère une erreur.

La variable système secure_auth n'autorise qu'une valeur de 1, une valeur de 0 n'est plus autorisée.

Pour la variable système old_passwords, la valeur 1 (produire des hachages antérieurs à 4.1) n'est plus autorisée.

Le mysqladmin La commande old-password est supprimée.

MySQL inclut désormais un plugin d'authentification côté serveur nommé mysql_no_login pour configurer des comptes qui n'acceptent aucune connexion client. Ce plugin permet aux DBA de mettre en œuvre les cas d'utilisation suivants :

Les objets programme et vue stockés qui effectuent des opérations sensibles ou administratives doivent s'exécuter avec des privilèges élevés. Les utilisateurs moins privilégiés doivent pouvoir exécuter ces objets mais ne pas pouvoir se connecter directement en tant que compte disposant des privilèges. Pour implémenter cela, créez un compte sans connexion à l'aide de mysql_no_login , accordez-lui les privilèges requis, définissez des objets avec un DEFINER de ce compte et incluez SQL SECURITY DEFINER dans les définitions.

L'accès à un compte proxy doit toujours se faire par le mécanisme proxy habituel, jamais par les utilisateurs se connectant directement au compte proxy. Pour implémenter cela, affectez mysql_no_login comme plug-in d'authentification lorsque vous créez le compte proxy.

Les distributions MySQL tentent désormais de se déployer avec les fonctionnalités SSL et RSA activées par défaut.

Pour faciliter la prise en charge des connexions cryptées, les serveurs MySQL compilés à l'aide d'OpenSSL peuvent désormais générer automatiquement des fichiers SSL et RSA au démarrage s'ils sont manquants :

Le serveur génère automatiquement un certificat SSL côté serveur et côté client et des fichiers de clés dans le répertoire de données si la nouvelle variable système auto_generate_certs est activée, aucune option SSL autre que --ssl n'est spécifiée et les fichiers SSL côté serveur sont manquants. le répertoire de données. Ces fichiers permettent des connexions client cryptées à l'aide de SSL.

Le serveur génère automatiquement des fichiers de paires de clés privées/publiques RSA dans le répertoire de données si la nouvelle variable système sha256_password_auto_generate_rsa_keys est activée, aucune option RSA n'est spécifiée et les fichiers RSA sont manquants dans le répertoire de données. Ces fichiers permettent un échange de mot de passe sécurisé à l'aide de RSA sur des connexions non cryptées pour les comptes authentifiés par le plug-in sha256_password.

La valeur de l'option --ssl côté serveur est désormais activée par défaut pour tous les serveurs. Pour les serveurs compilés à l'aide d'OpenSSL, si --ssl est activé et que d'autres options SSL ne sont pas données pour configurer SSL explicitement, le serveur tente d'activer SSL automatiquement au démarrage :

Si le serveur trouve des fichiers SSL valides nommés ca.pem , server-cert.pem et server-key.pem dans le répertoire de données, il permet à SSL d'autoriser les connexions SSL par les clients. (Ces fichiers n'ont pas besoin d'avoir été générés automatiquement, ce qui compte, c'est qu'ils portent les noms indiqués et qu'ils soient valides.)

Si le serveur ne trouve pas de fichiers SSL valides dans le répertoire de données, il continue de s'exécuter mais n'active pas SSL.

Pour tous les fichiers SSL et RSA que le serveur trouve et utilise automatiquement, il utilise les noms de fichiers pour définir les variables système correspondantes ( ssl_ca , ssl_cert , ssl_key , sha256_password_private_key_path , sha256_password_public_key_path ).

Prise en charge des données spatiales

InnoDB : Les index SPATIAL peuvent désormais être utilisés pour les tables InnoDB. InnoDB prend en charge l'indexation des types de données spatiales, y compris l'utilisation de ALTER TABLE . ALGORITHM=INPLACE pour les opérations en ligne ( AJOUTER UN INDEX SPATIAL ). Pour prendre en charge les propriétés d'isolation des transactions, InnoDB utilise le verrouillage de prédicat. Un verrou de prédicat verrouille le rectangle de délimitation minimum (MBR) utilisé pour une requête afin que d'autres transactions ne puissent pas insérer ou modifier une ligne qui correspondrait à la condition de requête.

Les directives de l'Open Geospatial Consortium documentent l'utilisation de polygones ouverts (polygones où le point de départ n'est pas égal au point d'arrivée), mais l'implémentation du SIG MySQL ne les prenait pas en charge. Désormais, MySQL prend en charge les polygones ouverts : un polygone ouvert est converti en polygone fermé en ajoutant le point de départ à la séquence de points. Avant:

GeometryCollection() a renvoyé NULL si l'argument contenait des géométries non prises en charge. Désormais, GeometryCollection() renvoie toutes les géométries appropriées contenues dans l'argument même si une géométrie non prise en charge est présente. (Bogue #17168643)

Cette version MySQL utilise davantage la bibliothèque Boost.Geometry pour fournir une meilleure fiabilité et une fonctionnalité accrue pour les fonctions spatiales. En conséquence, plusieurs fonctions auparavant non implémentées ont été implémentées, et plusieurs fonctions précédemment existantes acceptent désormais une gamme plus large de types d'arguments géométriques (ou des combinaisons de types d'arguments pour les fonctions qui prennent plusieurs géométries) :

Ces fonctions d'opérateur spatial auparavant non implémentées sont désormais disponibles : ST_ConvexHull , ST_Difference() , ST_Intersection() , ST_SymDifference() et ST_Union() .

Ces fonctions précédemment existantes sont plus robustes et renvoient des valeurs non NULL pour plus de types d'arguments de géométrie : ST_Area() , ST_Centroid() , ST_Contains() , ST_Crosses() , ST_Disjoint() , ST_Distance() , ST_Envelope() , ST_Equals() , ST_Intersects() , ST_Overlaps() , ST_Touches() et ST_Within() . Ces fonctions existent également en tant que synonymes non ST_, par exemple, ST_Area() et Area() sont des synonymes.

MySQL inclut désormais des fonctions de conversion entre les documents GeoJSON et les valeurs spatiales : ST_AsGeoJSON() et ST_GeomFromGeoJSON() . Pour plus d'informations, consultez Fonctions GeoJSON spatiales.

MySQL inclut désormais des fonctions qui permettent de manipuler les valeurs de geohash, ce qui fournit aux applications la possibilité d'importer et d'exporter des données de geohash, ainsi que d'indexer et de rechercher des valeurs de geohash :

ST_GeoHash() renvoie une chaîne de géohash en fonction d'une longueur de valeur de retour et de valeurs de longitude et de latitude ou d'une valeur POINT.

ST_LongFromGeoHash() et ST_LatFromGeoHash() renvoient la valeur de longitude ou de latitude, respectivement, en fonction d'un argument de chaîne geohash.

ST_PointFromGeoHash() produit une valeur POINT à partir d'un argument de chaîne geohash.

Remarques sur le mode SQL

Modification incompatible : Ces modifications du mode SQL ont été apportées :

Le mode SQL strict pour les moteurs de stockage transactionnel ( STRICT_TRANS_TABLES ) est désormais activé par défaut.

L'implémentation du mode SQL ONLY_FULL_GROUP_BY a été rendue plus sophistiquée, pour ne plus rejeter les requêtes déterministes qui étaient auparavant rejetées.

MySQL reconnaît désormais lorsqu'une colonne sélectionnée non agrégée est fonctionnellement dépendante (déterminée uniquement par) les colonnes GROUP BY.

MySQL a une extension au SQL standard qui permet des références dans la clause HAVING à des expressions aliasées dans la liste de sélection. Auparavant, l'activation de ONLY_FULL_GROUP_BY désactivait cette extension, nécessitant ainsi l'écriture de la clause HAVING à l'aide d'expressions sans alias. Cette restriction a été levée afin que la clause HAVING puisse faire référence à des alias, que ONLY_FULL_GROUP_BY soit activé ou non.

En conséquence, ONLY_FULL_GROUP_BY est désormais activé par défaut, pour interdire les requêtes non déterministes contenant des expressions dont la détermination unique au sein d'un groupe n'est pas garantie.

Les modifications apportées au mode SQL par défaut entraînent une valeur de variable système sql_mode par défaut avec ces modes activés : ONLY_FULL_GROUP_BY , STRICT_TRANS_TABLES , NO_ENGINE_SUBSTITUTION .

Le mode ONLY_FULL_GROUP_BY est désormais inclus dans les modes compris par le mode ANSI SQL.

Une nouvelle fonction, ANY_VALUE() , est disponible et peut être utilisée pour forcer MySQL à accepter les requêtes qui, selon lui, devraient être rejetées avec ONLY_FULL_GROUP_BY activé. La valeur et le type de retour de la fonction sont identiques à la valeur et au type de retour de son argument, mais le résultat de la fonction n'est pas vérifié pour le mode SQL ONLY_FULL_GROUP_BY.

Si vous constatez que l'activation de ONLY_FULL_GROUP_BY entraîne le rejet des requêtes pour les applications existantes, l'une de ces actions doit restaurer le fonctionnement :

S'il est possible de modifier une requête incriminée, faites-le, soit de manière à ce que les colonnes non agrégées non déterministes soient fonctionnellement dépendantes des colonnes GROUP BY, soit en faisant référence aux colonnes non agrégées à l'aide de ANY_VALUE() .

S'il n'est pas possible de modifier une requête incriminée (par exemple, si elle est générée par une application tierce), définissez la variable système sql_mode au démarrage du serveur pour ne pas activer ONLY_FULL_GROUP_BY .

Pour plus d'informations sur les modes SQL et les requêtes GROUP BY, consultez Modes SQL du serveur et gestion MySQL de GROUP BY. (Bogue #18486310)

Fonctionnalité ajoutée ou modifiée

Modification incompatible : La fonction GET_LOCK() a été réimplémentée à l'aide du sous-système de verrouillage des métadonnées (MDL) et ses capacités ont été étendues :

Auparavant, GET_LOCK() autorisait l'acquisition d'un seul verrou nommé à la fois, et un deuxième appel GET_LOCK() libérait tout verrou existant. Désormais, GET_LOCK() permet l'acquisition de plusieurs verrous nommés simultanés et ne libère pas les verrous existants.

Les applications qui reposent sur le comportement de GET_LOCK() libérant tout verrou précédent doivent être modifiées pour le nouveau comportement.

La possibilité d'acquérir plusieurs verrous introduit la possibilité d'un blocage entre les clients. Le sous-système MDL détecte le blocage et renvoie une erreur ER_USER_LOCK_DEADLOCK lorsque cela se produit.

Le sous-système MDL impose une limite de 64 caractères sur les noms de verrous, donc cette limite s'applique désormais également aux verrous nommés. Auparavant, aucune limite de longueur n'était appliquée.

Les verrous acquis avec GET_LOCK() apparaissent désormais dans la table de schéma de performances metadata_locks. La colonne OBJECT_TYPE indique USER LEVEL LOCK et la colonne OBJECT_NAME indique le nom du verrou.

Une nouvelle fonction, RELEASE_ALL_LOCKS() permet la libération de tous les verrous nommés acquis à la fois.

Modification incompatible : Dans MySQL 5.6.6, le type de données YEAR(2) était déprécié. La prise en charge de YEAR(2) a maintenant été supprimée. Une fois que vous avez mis à niveau vers MySQL 5.7.5 ou une version plus récente, toutes les colonnes YEAR(2) restantes doivent être converties en YEAR(4) pour redevenir utilisables. Pour les stratégies de conversion, voir Limitations de l'ANNÉE à 2 chiffres(2) et Migration vers l'ANNÉE à 4 chiffres. Par exemple, exécutez mysql_upgrade après la mise à niveau.

Modification incompatible : Précédemment, mysql_upgrade effectué une mise à niveau en appelant le mysql et mysqlcheck clientes. mysql_upgrade a été réimplémenté pour générer lui-même les instructions SQL requises et les exécuter en communiquant directement avec le serveur.

En conséquence de ce changement, mysql_upgrade prend désormais en charge l'option --bind-address permettant de choisir l'interface réseau de connexion au serveur. Il prend également en charge les options --net-buffer-length et --max-allowed-packet permettant de spécifier la taille initiale et maximale du paquet de communication.

Aussi à la suite de ce changement, mysql_upgrade ne prend plus en charge l'option --tmpdir. Cette option spécifiait l'emplacement des fichiers temporaires utilisés pour fournir une entrée à mysql , mais cela n'a plus d'utilité car mysql_upgrade n'invoque plus mysql . Tous les scripts de mise à niveau qui appellent mysql_upgrade et utilisez --tmpdir doit être modifié pour supprimer cette option.

InnoDB : Pour des performances d'arrêt et de récupération optimales, les phases d'arrêt et de récupération sont désormais prises en charge par la fonction de nettoyage de page multithread ( innodb_page_cleaners ) qui a été introduite dans MySQL 5.7.4. (Bogue #18805275)

InnoDB : Un travail a été fait pour introduire la notion de transactions attachables dans InnoDB (pour les transactions AutoCommit / ReadOnly / ReadCommitted / NonLocking). Ceci est utilisé pour lire à partir des tables du dictionnaire de données InnoDB. Parallèlement à cela, les transactions pouvant être attachées ont été exposées au serveur. Le code d'accès au dictionnaire de données les utilisera pour lire les données du dictionnaire de données.

InnoDB : Vous pouvez désormais tronquer les journaux d'annulation qui résident dans les tablespaces d'annulation. Cette fonctionnalité est activée à l'aide de l'option de configuration innodb_undo_log_truncate. Pour plus d'informations, consultez Troncation des tablespaces d'annulation.

InnoDB : Les allocations de mémoire InnoDB sont désormais instrumentées pour le schéma de performance et apparaîtront dans les tableaux récapitulatifs de la mémoire.

InnoDB : Au lieu d'insérer un enregistrement d'index à la fois, InnoDB effectue désormais un chargement en bloc lors de la création ou de la reconstruction d'index. Cette méthode de création d'index est également connue sous le nom de construction d'index trié. Cette amélioration, qui améliore l'efficacité de la création d'index, s'applique également aux index de texte intégral. Il n'est pas pris en charge avec les index spatiaux.

Une nouvelle option de configuration globale, innodb_fill_factor , définit le pourcentage d'espace sur chaque page qui est rempli de données lors d'une construction d'index trié, l'espace restant étant réservé à la croissance future de l'index. Pour plus d'informations, consultez Constructions d'index triés.

InnoDB : Le champ FIL_PAGE_FLUSH_LSN, écrit dans la première page de chaque fichier d'espace de table système InnoDB et dans les fichiers d'espace de table d'annulation InnoDB, n'est désormais écrit que dans le premier fichier de l'espace de table système InnoDB (numéro de page 0:0).

À la suite de ce correctif, si vous disposez d'un tablespace de système de fichiers multiples et que vous décidez de passer de MySQL 5.7 à MySQL 5.6, vous pouvez rencontrer un message invalide au démarrage de MySQL 5.6 indiquant que les numéros de séquence du journal X et oui dans les fichiers ibdata ne correspondent pas au numéro de séquence du journal oui dans les ib_logfiles . Si vous rencontrez ce message, redémarrez MySQL 5.6 pour vous assurer que le démarrage s'est correctement déroulé. Le message invalide ne devrait plus apparaître.

InnoDB : Le paramètre innodb_buffer_pool_size est désormais dynamique, vous permettant de redimensionner le pool de mémoire tampon sans redémarrer le serveur. L'opération de redimensionnement, qui consiste à déplacer les pages vers un nouvel emplacement en mémoire, est effectuée par morceaux. La taille des morceaux est configurable à l'aide de la nouvelle option de configuration innodb_buffer_pool_chunk_size. Vous pouvez surveiller la progression du redimensionnement à l'aide de la nouvelle variable d'état Innodb_buffer_pool_resize_status. Pour plus d'informations, consultez Configuration en ligne de la taille du pool de mémoire tampon InnoDB.

Réplication : Lors de la réplication d'un maître exécutant une version antérieure à MySQL 5.6.0 vers un esclave exécutant MySQL 5.6.0 ou supérieur, l'esclave requiert la valeur master_uuid, qui est la valeur server_uuid du maître. La valeur master_uuid n'est pas prise en charge sur l'ancien maître et, dans une telle situation de réplication, pourrait devenir invalide sur le nouvel esclave. Une vérification de master_uuid vide garantit maintenant que l'esclave utilise une valeur vide pour master_uuid . (Bogue #18338203)

Réplication : Les nouvelles tentatives de transactions sont désormais prises en charge lorsque le multithreading est activé sur un esclave. Dans les versions précédentes, slave_transaction_retries était traité comme égal à 0 lors de l'utilisation d'esclaves multithreads. (Bogue #16390504, Bug #68465)

Réplication : Les identifiants de transaction globaux (GTID) sont désormais enregistrés dans une table système MySQL chaque fois qu'ils sont activés sur le serveur, ce qui lève une exigence précédente d'utiliser la journalisation binaire lors de la réplication avec des GTID. Si la journalisation binaire est désactivée, le serveur stocke le GTID de chaque transaction dans la table mysql.gtid_executed lors de l'exécution de la transaction. Si la journalisation binaire est activée, alors, chaque fois que le journal binaire est tourné ou que le serveur est arrêté, le serveur écrit également dans le nouveau journal binaire les GTID de toutes les transactions du journal binaire précédent.

Étant donné que la table mysql.gtid_executed peut être remplie de nombreuses lignes avec des GTID à transaction unique ayant le même serveur d'origine et les mêmes ID de transaction séquentiels, le serveur compresse cette table périodiquement chaque fois que les GTID sont activés. Vous pouvez contrôler la fréquence à laquelle la table est compressée en définissant la variable système execute_gtids_compression_period. La valeur par défaut de cette variable est 1000, ce qui signifie que la compression de la table est appliquée après chaque 1000 transactions. Vous pouvez définir le paramètre execute_gtids_compression_period sur 0 pour désactiver complètement la compression, mais vous devez savoir que cela peut entraîner une augmentation significative de l'espace requis par cette table. (Voir la compression de table mysql.gtid_executed.)

La compression de la table mysql.gtid_executed est effectuée par un thread dédié. Vous pouvez obtenir des informations sur l'état de ce thread dans la table Schéma de performances des threads. (Bogue #14730192)

Réplication : La nouvelle variable simplifié_binlog_gtid_recovery peut être utilisée pour modifier la façon dont les fichiers journaux binaires sont recherchés pour les GTID précédents pendant la récupération, accélérant le processus lorsqu'un grand nombre de fichiers journaux binaires existent. (Bogue #69097, Bug #16741603, Bug #74071, Bug #19686914)

Réplication : La nouvelle variable système binlogging_impossible_mode contrôle ce qui se passe si le serveur ne peut pas écrire dans le journal binaire, par exemple, en raison d'une erreur de fichier. Pour une compatibilité descendante, la valeur par défaut de binlogging_impossible_mode est IGNORE_ERROR , ce qui signifie que le serveur enregistre l'erreur, arrête la journalisation et continue les mises à jour de la base de données. La définition de cette variable sur ABORT_SERVER fait que le serveur arrête la journalisation et s'arrête s'il ne peut pas écrire dans le journal binaire. (Bogue #51014, Bogue #11758766)

Réplication : Pour faciliter la surveillance d'une configuration de réplication, diverses variables liées à la réplication ont été déplacées vers les tables performance_schema. Ceci est particulièrement utile pour surveiller la réplication multi-source.

Réplication : La nouvelle fonction SQL WAIT_FOR_EXECUTED_GTID_SET() rend l'option de synchronisation actuelle pour l'esclave avec le maître indépendante des threads esclaves et améliore la valeur de retour.

Réplication : Les nouvelles options binlog_group_commit_sync_delay et binlog_group_commit_sync_no_delay_count permettent de configurer la synchronisation du journal binaire. Cela permet de synchroniser davantage de transactions sur le disque à la fois, réduisant ainsi le temps global de validation d'un groupe de transactions, car les groupes plus importants nécessitent moins d'unités de temps par groupe.

Réplication : Les esclaves multithreads peuvent utiliser la nouvelle variable slave_preserve_commit_order pour s'assurer que l'ordre dans lequel les transactions ont été validées sur le maître est préservé sur l'esclave. Cela empêche l'esclave d'entrer dans un état dans lequel le maître n'était pas et est bien adapté à l'utilisation d'esclaves multithreads pour le scale-out de lecture de réplication.

La nouvelle prise en charge des distributions Debian7, Ubuntu12.04 et Ubuntu14.04 qui a été introduite avec la 5.6.17 est désormais fournie avec la source d'empaquetage spécifique à la plate-forme placée sous le répertoire d'empaquetage, dans les répertoires deb-precise , deb-wheezy et deb-trusty . (Bogue #19020385)

Cfaire le support a été mis à jour pour gérer Cfaire version 3. (Bogue #19001781)

Le rwlock utilisé pour l'implémentation de SAFE_HASH est désormais instrumenté pour le schéma de performance. Le nom de l'instrument est wait/synch/rwlock/mysys/SAFE_HASH::lock . (Bogue #18991366)

Le (sans papiers) configuration-binaire.sh le script a été supprimé des distributions MySQL. (Bogue #18694238)

RHEL 4 n'est pas pris en charge pour 5.7, donc le fichier support-files/RHEL4-SElinux a été supprimé. (Bogue #18651087)

Le (non documenté) FEATURE_SET Cfaire l'option a été supprimée. (Bogue #18521389)

Les champs privés inutilisés signalés par l'option d'avertissement du compilateur -Wunused-private-field de Clang ont été supprimés. (Bogue #18489724)

thr_alarm.h et thr_alarm.c ont été supprimés car ils contiennent presque exclusivement du code mort. Le code live restant a été déplacé vers mysqld.cc . my_alarm.h et my_alarm.c ont également été supprimés, et le code qui en est réellement utilisé a été déplacé vers my_lock.c . (Bogue #18411456)

La variable système obsolète timed_mutexes a été supprimée. (Bogue #18277305)

Cfaire le support a été mis à jour pour gérer la nouvelle disposition des répertoires pour Sun C++ 5.13. (Bogue #73034, Bug #19010286)

L'obsolète et non entretenu jeu de caractères2html L'utilitaire a été supprimé des distributions MySQL. (Bogue #71897, Bug #18352347)

mysqld le texte d'aide pour --general_log a été clarifié. Merci à Andrew Gaul pour le patch. (Bogue #71463, Bug #18127243)

Le fichier fill_help_tables.sql utilisé pour charger le contenu de la table d'aide côté serveur contient désormais l'instruction suivante pour supprimer la journalisation binaire et empêcher la réplication du contenu de la table vers les esclaves :

Étant donné que le contenu de la table d'aide est spécifique à une version de serveur particulière, cela empêche le chargement de contenu incorrect dans les esclaves, qui n'exécutent pas nécessairement la même version de MySQL que le maître. (Bogue #69564, Bug #17015822)

La chaîne vide fournie pour les options numériques ou d'énumération (par exemple, --port="" ) a produit un comportement incohérent ou déroutant. Ces valeurs d'option vides sont désormais rejetées avec une erreur. (Bogue #68055, Bogue #16102788)

Le mysqladmin flush-logs La commande permet désormais de fournir des types de journaux facultatifs, pour spécifier les journaux à vider. Après la commande flush-logs, vous pouvez fournir une liste séparée par des espaces d'un ou plusieurs des types de journaux suivants : binary , engine , error , general , relay , slow . Ceux-ci correspondent aux types de journaux qui peuvent être spécifiés pour l'instruction SQL FLUSH LOGS. Merci à Daniël van Eeden pour le patch. (Bogue #60878, Bug #12368203)

Une nouvelle variable d'état, Max_used_connections_time , indique l'heure à laquelle Max_used_connections a atteint sa valeur actuelle. Merci à Jordi Prats pour le patch. (Bogue #59738, Bogue #11766596)

Auparavant, sur les systèmes Unix et de type Unix, la prise en charge de MySQL pour l'envoi du journal des erreurs du serveur à syslog était implémentée en ayant mysqld_safe capturez la sortie d'erreur du serveur et transmettez-la à syslog . Le serveur inclut désormais la prise en charge native de syslog, qui a été étendue pour inclure Windows. La journalisation des erreurs du serveur dans syslog , Event Log ou un fichier doit être contrôlée à l'aide de mysqld option. En utilisant mysqld_safe options est maintenant obsolète. Pour plus d'informations sur l'envoi de la sortie d'erreur du serveur à syslog , consultez Le journal des erreurs.

De plus, le contrôle de la sortie du journal système est distinct de l'envoi de la sortie d'erreur à un fichier ou à la console, sur toutes les plateformes. Auparavant, cela n'était vrai que pour Windows. Sur les systèmes Unix et de type Unix, la sortie d'erreur peut désormais être dirigée vers un fichier ou la console en plus ou à la place du journal système, comme vous le souhaitez. Ceci est vrai aussi bien pour mysqld et mysqld_safe . Précédemment, mysqld_safe ignoré son option --syslog avec un avertissement si --log-error était également donné. (Bogue #55370, Bug #11762739)

Si les identifiants de connexion dépassaient la limite de 32 bits et recommençaient à 1, le serveur s'assure désormais que les identifiants encore utilisés ne seront pas réémis. (Bogue #44167, Bug #11752851)

En interne, les types de données spatiales tels que la géométrie sont représentés sous forme de valeurs BLOB, donc lorsqu'ils sont appelés avec l'option --hex-blob, mysqldump affiche désormais les valeurs spatiales en hexadécimal. (Bogue #43544, Bug #11752369)

L'évolutivité des tables InnoDB a été améliorée en évitant les verrous THR_LOCK. À la suite de ce changement, les instructions DML pour les tables InnoDB qui attendaient auparavant un verrou THR_LOCK attendront un verrou de métadonnées :

Les transactions lancées explicitement ou implicitement qui mettent à jour n'importe quelle table (transactionnelle ou non transactionnelle) seront bloquées et bloquées par LOCK TABLES . LIRE pour cette table. Ceci est similaire à la façon dont LOCK TABLES . ÉCRIRE fonctionne.

Les tables qui sont implicitement verrouillées par LOCK TABLES seront désormais verrouillées à l'aide de verrous de métadonnées plutôt que de verrous THR_LOCK (pour les tables InnoDB) et verrouillées à l'aide de verrous de métadonnées en plus des verrous THR_LOCK (pour tous les autres moteurs de stockage). Des verrous implicites se produisent pour les tables sous-jacentes d'une vue verrouillée, les tables utilisées par les déclencheurs d'une table verrouillée ou les tables utilisées par les programmes stockés appelés à partir de ces vues et déclencheurs.

Les mises à jour de plusieurs tables seront désormais bloquées et bloquées par les LOCK TABLES simultanées. Instructions READ sur n'importe quelle table dans la mise à jour, même si la table est utilisée uniquement pour la lecture.

MANIPULATEUR. READ pour tout moteur de stockage se bloquera et sera bloqué par un LOCK TABLES simultané. WRITE , mais maintenant en utilisant un verrou de métadonnées plutôt qu'un verrou THR_LOCK.

Les changements précédents sont visibles de plusieurs manières. Par exemple, lorsqu'une instruction DML telle que INSERT INTO t1 dans une session est bloquée par LOCK TABLES t1 READ dans une autre session :

Dans le schéma de performances, les acquisitions et les attentes THR_LOCK seront enregistrées dans la table metadata_locks et pour les événements wait/lock/metadata/sql/mdl plutôt que enregistrées dans la table table_handles et pour les événements wait/lock/table/sql/handler.

Dans la liste des processus ( SHOW PROCESSLIST ou INFORMATION_SCHEMA.PROCESSLIST ), la valeur d'état sera Waiting for table metadata lock plutôt que Waiting for table level lock .

Les variables d'état Table_locks_immediate et Table_locks_waited ne seront plus incrémentées.

Problèmes résolus suite à ces modifications de verrouillage :

Pour les versions de débogage, exécution simultanée de LOCK TABLES . READ et une instruction DML affectant la même table InnoDB peuvent conduire à un verrou Found de type 6 qui est des avertissements verrouillés en écriture et en lecture dans le journal des erreurs.

L'exécution d'instructions DDL sous LOCK TABLES aurait pu conduire à un blocage si 1) cette instruction LOCK TABLES, en plus de la table à modifier par DDL, avait également certaines tables verrouillées en lecture ou verrouillées implicitement (par exemple, via des déclencheurs) et 2 ) il y avait un DML concurrent qui était bloqué sur un verrou au niveau de la table détenu par LOCK TABLES et 3) il y avait un PREPARE concurrent (ou un appel API de connecteur correspondant) qui a préparé une instruction utilisant des tables à affecter par le premier DDL et d'autres table qui a été affectée par une autre instruction DDL qui a dû attendre l'instruction DML.

Le mysql le client indique maintenant si les instructions USE ont produit des avertissements. (Bogue #29965, Bug #11746951)

Dans le protocole client/serveur MySQL, les paquets EOF et OK ont le même objectif, pour marquer la fin d'un résultat d'exécution de requête. En raison de changements récents dans le paquet OK (comme le suivi de l'état de session), et pour éviter de répéter les changements dans le paquet EOF, le paquet EOF est désormais obsolète.

Les tables d'aide côté serveur et les tables de fuseau horaire dans la base de données système mysql sont désormais des tables InnoDB (transactionnelles). Auparavant, il s'agissait de tables MyISAM (non transactionnelles). Les tables concernées sont :

Si vous effectuez une mise à niveau vers cette version MySQL à partir d'une version antérieure, vous devez exécuter mysql_upgrade (et redémarrez le serveur) pour incorporer ces changements dans la base de données mysql.

Les instructions START TRANSACTION et COMMIT ont été ajoutées à la sortie de mysql_tzinfo_to_sql utilisé pour remplir les tables de fuseau horaire, pour s'assurer que les opérations de rechargement sont permanentes.

MySQL Server prend désormais en charge un « mode hors ligne » avec ces caractéristiques :

Les utilisateurs clients connectés qui n'ont pas le privilège SUPER sont déconnectés à la prochaine requête, avec une erreur appropriée. La déconnexion inclut l'arrêt des instructions en cours et la libération des verrous. De tels clients ne peuvent pas non plus initier de nouvelles connexions et reçoivent une erreur appropriée.

Les utilisateurs clients connectés qui ont le privilège SUPER ne sont pas déconnectés et peuvent initier de nouvelles connexions pour gérer le serveur.

Les threads esclaves de réplication sont autorisés à continuer à appliquer les données au serveur.

Seuls les utilisateurs disposant du privilège SUPER peuvent contrôler le mode hors ligne. Pour mettre un serveur en mode hors ligne, modifiez la valeur de la nouvelle variable système offline_mode de OFF à ON . Pour reprendre les opérations normales, changez offline_mode de ON à OFF . En mode hors ligne, les clients auxquels l'accès est refusé reçoivent une erreur ER_SERVER_OFFLINE_MODE.

MODIFIER TABLE . La syntaxe EXCHANGE PARTITION inclut désormais une option Clause de VALIDATION. Lorsque SANS VALIDATION est spécifié, ALTER TABLE . EXCHANGE PARTITION n'effectue pas de validation ligne par ligne lors de l'échange d'une table remplie avec la partition, ce qui permet aux administrateurs de base de données d'assumer la responsabilité de s'assurer que les lignes se trouvent dans les limites de la définition de la partition. WITH VALIDATION est le comportement par défaut et n'a pas besoin d'être spécifié explicitement. Pour plus d'informations, consultez Échanger des partitions et des sous-partitions avec des tables.

mysqlslap dispose désormais d'une option --sql-mode qui permet de définir le mode SQL pour la session client.

Il est désormais possible de spécifier le moteur de stockage que le serveur utilise pour les tables temporaires internes sur disque (voir Utilisation des tables temporaires internes dans MySQL), en définissant la nouvelle variable système internal_tmp_disk_storage_engine.Les valeurs autorisées sont MYISAM (par défaut) et INNODB .

En conséquence de ce changement, le serveur n'est plus empêché d'utiliser une table temporaire en mémoire pour les requêtes contenant une colonne de chaîne dans une clause GROUP BY ou DISTINCT supérieure à 512 octets pour les chaînes binaires ou 512 caractères pour les chaînes non binaires.

L'implémentation personnalisée de rwlock pour Windows a été remplacée par des appels API Windows standard. À la suite de ce changement, les binaires Windows nécessitent Windows 7 / Windows Server 2008 R2 ou plus récent. En particulier, les binaires Windows ne fonctionnent plus sur Windows Vista ou Windows Server 2008 (plain, pas R2).

La bibliothèque Boost.Geometry est désormais requise pour construire MySQL. Deux nouveaux Cfaire les options permettent de contrôler l'emplacement de la source de la bibliothèque et de la télécharger automatiquement :

-DWITH_BOOST= nom_chemin spécifie l'emplacement du répertoire de la bibliothèque Boost. Il est également possible de spécifier l'emplacement de Boost en définissant la variable d'environnement BOOST_ROOT ou WITH_BOOST.

-DDOWNLOAD_BOOST= bool spécifie s'il faut télécharger la source Boost si elle n'est pas présente à l'emplacement spécifié. La valeur par défaut est DÉSACTIVÉE.

Par exemple, si vous construisez normalement MySQL en plaçant la sortie de l'objet dans le sous-répertoire bld de votre arborescence source MySQL, vous pouvez construire avec Boost comme ceci :

Cela provoque le téléchargement de Boost dans le répertoire my_boost sous votre répertoire personnel. Si la version Boost requise est déjà présente, aucun téléchargement n'est effectué. Si la version Boost requise change, la version la plus récente est téléchargée.

Si Boost est déjà installé localement et que votre compilateur trouve les fichiers d'en-tête Boost tout seul, il n'est peut-être pas nécessaire de spécifier ce qui précède Cfaire option. Cependant, si la version de Boost requise par MySQL change et que la version installée localement n'a pas été mise à niveau, vous pouvez avoir des problèmes de build. En utilisant le Cfaire les options devraient vous donner une construction réussie.

L'obsolète mysqlhotcopy L'utilitaire a été supprimé des distributions MySQL. Les alternatives comprennent mysqldump et MySQL Enterprise Backup.

L'obsolète mysqlbug , mysql_waitpid , et mysql_zap les utilitaires ont été supprimés des distributions MySQL.

La variable système obsolète storage_engine a été supprimée. Utilisez plutôt default_storage_engine.

Bugs corrigés

Partitionnement des modifications importantes : Dans une instruction ALTER TABLE, le serveur a accepté REBUILD avec le nom d'une sous-partition comme syntaxe valide même si le mot clé REBUILD dans ce cas n'a rien fait. Maintenant, REBUILD est rejeté dans de tels cas et provoque l'échec de l'instruction avec une erreur. (Bogue #19075411, Bug #73130)

Références : Ce problème est une régression de : Bug #14028340, Bug #65184.

Réplication des modifications importantes : Une instruction DROP TABLE peut être divisée en plusieurs instructions avant d'être envoyée au journal binaire si elle contient des tables normales (non temporaires) et des tables temporaires, ou si elle contient des tables temporaires utilisant à la fois des moteurs de stockage transactionnels et non transactionnels. Désormais, lors de l'utilisation de GTID, les instructions DROP TABLE affectant ces combinaisons de tables ne sont plus autorisées à moins que la valeur de la variable système gtid_next ne soit AUTOMATIC . En effet, avec les GTID activés sur le serveur, émettre un DROP TABLE dans les cas qui viennent d'être décrits tout en n'ayant qu'un seul GTID associé à chaque instruction (le thread SQL le fait en suivant SET gtid_next=' uuid : numéro ' ) cause des problèmes lorsqu'il n'y a pas assez de GTID pour l' affectation à toutes les instructions résultantes après la division de la DROP TABLE d' origine .

Une instruction DROP TABLE peut être fractionnée en raison du comportement de l'instruction par rapport à la transaction en cours qui varie, selon les caractéristiques de la table, comme suit :

DROP TABLE d'une table régulière (non temporaire) est validée immédiatement

DROP TABLE d'une table temporaire utilisant un moteur de stockage transactionnel est validée avec la transaction en cours (après COMMIT )

DROP TABLE d'une table temporaire qui utilise un moteur de stockage non transactionnel est validée immédiatement

Le fait de nommer ces trois types de tables dans une seule instruction DROP TABLE oblige le serveur MySQL à diviser l'instruction d'origine en trois instructions DROP TABLE distinctes dans le journal binaire. Si les GTID sont activés mais que la valeur de gtid_next n'est pas AUTOMATIC , l'émission d'une instruction DROP TABLE qui mélange l'un des types de tables décrits précédemment fait que le serveur a un nombre insuffisant de GTID à écrire avec toutes les instructions résultantes dans le journal binaire. De plus, DROP TABLE IF EXISTS est toujours écrit dans le journal binaire pour toutes les tables spécifiées dans l'instruction, même si certaines ou toutes les tables n'existent pas.

Étant donné que les tables temporaires sont gérées différemment par DROP TABLE selon qu'elles utilisent un moteur de stockage transactionnel ou non transactionnel, toutes les tables nommées par une instruction DROP TEMPORARY TABLE qui n'existent pas sont supposées être transactionnelles. Cela signifie que, si un DROP TEMPORARY TABLE avec deux tables temporaires non transactionnelles est émis sur le maître, il n'écrira qu'une seule instruction DROP TABLE nommant les deux tables. Si l'une des tables temporaires n'existe plus sur l'esclave, alors, lorsque le thread SQL exécute l'instruction, il essaie de la diviser en plusieurs instructions car cela affecte une table temporaire non transactionnelle (mais existante) et une table temporaire transactionnelle inexistante. entraîne des problèmes car le thread SQL n'a qu'un seul GTID pour l'instruction DROP TABLE d'origine mais doit écrire deux instructions DROP TABLE dans le journal binaire.

De plus, lorsque l'esclave supprimait les tables temporaires après avoir détecté que le maître avait redémarré, il enregistrait une instruction DROP TABLE par pseudo-thread et par base de données, mais combinait les tables temporaires à l'aide de moteurs de stockage transactionnels et non transactionnels dans une seule instruction DROP TABLE.

Maintenant, nous lançons une erreur dans la session client si gtid_next est défini sur un uuid : numéro value et une instruction DROP TABLE est émise mélangeant l'un des types de table décrits précédemment.

De plus, nous regroupons maintenant les tables temporaires inexistantes et supposons qu'elles sont transactionnelles uniquement si au moins une table temporaire transactionnelle est supprimée par l'instruction. Si aucune table temporaire transactionnelle n'est supprimée, toutes les tables temporaires inexistantes sont supposées être des tables temporaires non transactionnelles.

L'esclave gère désormais également correctement la suppression des tables temporaires en cas de redémarrage par le maître. (Bogue #17620053)

Réplication des modifications importantes : La longueur maximale pouvant être utilisée pour le mot de passe dans une instruction CHANGE MASTER TO est de 32 caractères. Auparavant, lorsqu'un mot de passe plus long était utilisé, il était accepté, mais tout excès de longueur était tronqué en silence par le serveur. Suite à ce correctif, lorsque la longueur du mot de passe dépasse 32 caractères, CHANGE MASTER TO échoue avec une erreur. (Bogue #11752299, Bogue #43439)

Réplication des performances : Lors du traitement du thread de vidage, un maître de réplication semi-synchrone vérifiait si le thread de vidage provenait ou non d'un esclave semi-synchrone en vérifiant la valeur de rpl_semi_sync_slave_enabled , mais l'a fait pour chaque opération effectuée sur ce thread, ce qui a eu un impact négatif significatif sur les performances. Désormais, cette vérification n'est effectuée qu'une seule fois, au démarrage du thread de vidage, ce qui devrait sensiblement améliorer les performances de la réplication semi-synchrone dans la plupart des cas. (Bogue #17932935)

Partitionnement InnoDB : Un grand nombre de tables InnoDB partitionnées peuvent consommer beaucoup plus de mémoire lorsqu'elles sont utilisées dans MySQL 5.6 ou 5.7 que la mémoire utilisée par les mêmes tables utilisées dans les versions précédentes du serveur MySQL. (Bogue #17780517, Bug #70641)

Références : Ce problème est une régression de : Bug #11764622, Bug #57480.

InnoDB Linux : Le TTASFutexMutex , l'implémentation mutex qui utilise le futex Linux, n'a pas réussi à demander l'alignement m_lock_word. (Bogue #19525395, Bug #73760)

InnoDB : Si un plantage se produit après une action de suppression d'index pendant une opération TRUNCATE TABLE, la page racine peut rester dans un état libre. Lors d'une récupération sur incident, une vérification LSN n'a pas réussi à vérifier les pages libres lors de la tentative d'épinglage de la page racine, ce qui a entraîné une assertion. (Bogue #19520482)

InnoDB : Remplacement d'une instruction goto par une instruction if dans la fonction fil_mutex_enter_and_prepare_for_io dans fil0fil.cc . (Bogue #19488149)

InnoDB : Une opération INSERT sur une table avec des colonnes de données spatiales a généré une assertion. (Bogue #19474851)

InnoDB : Suppression du code inutilisé lié aux informations de journal binaire stockées dans la page InnoDB trx_sys. (Bogue #19471743)

InnoDB : Une ALTER TABLE . L'opération ADD FOREIGN KEY peut provoquer une erreur grave. (Bogue #19471516, Bug #73650)

InnoDB : Appels mem_heap_zalloc réduits dans upd_create . Un seul appel est nécessaire pour allouer de la mémoire à upd_t . (Bogue #19297656, Bug #73272)

InnoDB : Dans les versions de débogage, une opération INSERT affectant les tables compressées déclencherait une assertion liée à la synchronisation. (Bogue #19295893)

InnoDB : Une opération ALTER TABLE a généré une assertion fk_tables.empty(). Après avoir appelé dict_load_foreigns() , toutes les tables associées qui sont liées par une clé étrangère doivent être chargées pour s'assurer que les clés étrangères sont mises en cache. (Bogue #19267051)

Références : Ce problème est une régression de : Bug #16244691.

InnoDB : Une transaction renvoyée par le pool de transactions n'était pas dans un état propre. (Bogue #19244969)

InnoDB : Un marqueur MLOG_CHECKPOINT a été omis par erreur lors de l'exécution d'un point de contrôle de journal. (Bogue n°19233510, bogue n°73304)

InnoDB : Lors de la récupération après incident, InnoDB appellerait exit() en cas de corruption ou d'incohérence. Certains des appels exit() ont été supprimés pour permettre à InnoDB de s'arrêter correctement. (Bogue #19229231, Bogue #73300)

InnoDB : Lorsque plusieurs options daemon_memcached_option sont définies, la table INFORMATION_SCHEMA.GLOBAL_VARIABLES et l'instruction SHOW VARIABLES ne doivent afficher que la première option daemon_memcached_option définie dans la chaîne de ligne de commande ou dans le fichier de configuration MySQL. (Bogue #19204759, Bogue #73287)

InnoDB : L'exécution répétée de SHOW ENGINE INNODB STATUS dans des conditions de test de performances peut entraîner une erreur grave. (Bogue #19196052)

InnoDB : Suppression de la variable one_flush inutilisée de storage/innobase/include/log0log.h . (Bogue #19192364, Bug #73269)

InnoDB : La récupération de plusieurs valeurs avec une seule commande get renverrait des résultats incorrects au lieu d'un message d'erreur. L'InnoDB memcaché Le plugin ne prend actuellement pas en charge la récupération de plusieurs valeurs avec une seule commande get. (Bogue #19172212, Bug #72453)

InnoDB : Tenter d'effectuer des opérations sur une clé expirée entraînerait le memcaché démon pour planter et redémarrer. (Bogue #19172013, Bug #72586)

InnoDB : Une opération ALTER TABLE qui n'effectue pas de tri sur l'index cluster peut entraîner un enregistrement en double. (Bogue #19163915)

Références : Voir aussi : Bug #17657223.

InnoDB : Amélioration de la gestion des erreurs, des diagnostics et de la couverture des tests liés à la gestion des erreurs de récupération après incident. (Bogue #19145637, Bug #73179)

InnoDB : Amélioration de la gestion des erreurs pour les appels à handler::records() . (Bogue #19142753)

Références : Ce problème est une régression de : Bug #16802288.

InnoDB : Avec un niveau d'isolement de transaction inférieur ou égal à READ COMMITTED , les verrous d'espacement n'étaient pas pris lors de l'analyse d'un index secondaire unique pour rechercher les doublons. Par conséquent, la logique de vérification des doublons a échoué, autorisant des valeurs de clé en double dans l'index secondaire unique. (Bogue #19140907)

Références : Ce problème est une régression de : Bug #16133801.

InnoDB : Une condition de concurrence qui s'est produite lors de la désactivation dynamique de innodb_adaptive_hash_index a provoqué l'assertion du thread de purge. (Bogue #19069698)

InnoDB : Le INNODB_PAGE_ATOMIC_REF_COUNT Cfaire L'option est supprimée dans MySQL 5.7.5. Cette option était activée par défaut mais pouvait être désactivée pour les systèmes qui ne prennent pas en charge les opérations atomiques. Depuis MySQL 5.7.5, la prise en charge des opérations atomiques est requise pour construire MySQL, rendant l'option INNODB_PAGE_ATOMIC_REF_COUNT obsolète. (Bogue #19061440)

InnoDB : Dans les versions de débogage, une assertion rw_latch == RW_NO_LATCH invalide entraînerait l'arrêt du serveur. (Bogue #18977128)

InnoDB : Ajout d'assertions de débogage au code d'index de hachage adaptatif pour vérifier que l'ID d'espace de table dans les blocs de tampon correspond à l'espace d'index. (Bogue #18965518, Bogue #72986)

InnoDB : Lors de la récupération, une erreur de segmentation se produirait lors du marquage d'une table comme corrompue. (Bogue #18942294)

Références : Ce problème est une régression de : Bug #11830883.

InnoDB : Un commentaire de code pour la fonction os_event_is_set dans storage/innobase/os/os0event.cc était incorrect. (Bogue #18940008, Bogue #72919)

InnoDB : Une violation d'ordre de verrouillage se produirait lors de l'insertion de données BLOB. (Bogue #18883885)

InnoDB : Pour PowerPC, InnoDB utilise désormais des instructions PowerPC spéciales pour définir la priorité des threads matériels dans les boucles de spin mutex InnoDB. Merci à Stewart Smith pour la contribution. (Bogue #18842925, Bogue #72754)

InnoDB : Le script de configuration innodb_memcached_config.sql a échoué après l'exécution du script mysql_secure_installation, qui supprime la base de données de test MySQL. Le script innodb_memcached_config.sql crée maintenant la base de données de test si elle n'existe pas. (Bogue #18816381, Bug #72678)

InnoDB : Suppression des définitions et déclarations de fonctions inutilisées de l'InnoDB memcaché API. (Bogue #18815992, Bug #72723)

InnoDB : CACHE_LINE_SIZE pour PowerPC est passé de 64 octets à 128 octets. (Bogue #18814859, Bug #72718)

InnoDB : L'ouverture d'une table parent contenant des milliers de tables enfants peut entraîner une longue condition d'attente de sémaphore. (Bogue #18806829)

InnoDB : trx_cleanup_at_db_startup n'a pas réussi à réinitialiser le contenu trx->rsegs->m-redo dans le code de débogage. (Bogue #18795594)

InnoDB : Sur mysqld start, la spécification de plusieurs fichiers de données à l'aide de l'option innodb_data_file_path renverrait une erreur d'identifiant d'espace dans l'en-tête fsp après l'écriture des données dans le deuxième fichier. (Bogue #18767811)

InnoDB : Lors du stockage des données BLOB, InnoDB n'a pas réussi à réserver les pages d'espace de table requises avant d'allouer les pages, ce qui a généré une assertion sur INSERT . (Bogue #18756233)

InnoDB : Une opération ALTER TABLE échouée sur place laisserait des noms de fichiers temporaires non uniques dans le dictionnaire de données empêchant de futures opérations ALTER TABLE sur la même table en raison de conflits de noms de fichiers temporaires. Pour éviter ce problème, les noms de fichiers temporaires sont rendus uniques en ajoutant un numéro global statique qui est initialisé à un nombre 32 bits distribué aléatoirement à l'aide de ut_time() et ut_crc32() . Le numéro est ensuite incrémenté de manière atomique pour chaque nom de fichier temporaire attribué. Auparavant, les fichiers temporaires étaient nommés au format #sql-ibtid , où tid correspond à l'ID de la table. Les fichiers temporaires sont désormais nommés au format #sql-ibtid-inc , où tid est l'ID de la table et inc est le nombre incrémenté. (Bogue #18734396, Bogue #72594)

InnoDB : Une régression introduite par le correctif du bogue #11758237 a entraîné une assertion curseur->index->name == TEMP_INDEX_PREFIX. (Bogue #18723872)

Références : Ce problème est une régression de : Bug #11758237.

InnoDB : Pour les recherches en texte intégral à élément unique, les documents supprimés ont été inclus dans les calculs de fréquence de document inverse (IDF). (Bogue #18711306, Bug #72548)

InnoDB : La fonction page_create a été optimisée pour utiliser des fonctions plus simples pour initialiser les pages. (Bogue #18704384)

InnoDB : Une opération DELETE sur une table avec des index de recherche en texte intégral a généré une assertion. (Bogue #18683832)

Références : Voir aussi : Bug #14639605.

InnoDB : Les fichiers d'espace de table à importer ( FIL_TYPE_IMPORT ) n'ont pas été vidés après avoir été convertis en fichiers d'espace de table normaux ( FIL_TYPE_TABLESPACE ), ce qui a entraîné un trop grand nombre de fichiers ouverts. (Bogue #18663997)

Références : Ce problème est une régression de : Bug #18236692.

InnoDB : Lorsqu'InnoDB est construit en tant que bibliothèque partagée, la tentative de chargement du plug-in INFORMATION_SCHEMA de recherche en texte intégral (FTS) InnoDB échouerait avec une erreur Impossible d'ouvrir la bibliothèque partagée 'ha_innodb.so'. (Bogue #18655281, Bogue #70178)

InnoDB : Lorsque vous appelez le memcaché flush_all, InnoDB tente d'initialiser une connexion et une transaction. Si la transaction est dans l'état TRX_STATE_NOT_STARTED, InnoDB n'a pas réussi à définir CONN_DATA->CRSR_TRX sur NULL, ce qui a entraîné une erreur grave. (Bogue #18652854)

InnoDB : Une opération INSERT sur une table avec des colonnes BLOB a soulevé une assertion. (Bogue #18646430)

Références : Ce problème est une régression de : Bug #16963396.

InnoDB : Une opération INSERT sur une table avec des colonnes GEOMETRY a soulevé une assertion dans rtr_page_split_and_insert() . (Bogue #18644435)

InnoDB : Le fichier d'espace de table temporaire ( ibtmp1 ) a été maintenu ouvert par le thread page_cleaner et n'a pas pu être supprimé au démarrage, ce qui a entraîné un blocage. (Bogue #18642372)

InnoDB : Une régression introduite dans MySQL 5.6.5 entraînerait la création de tables d'index de recherche en texte intégral dans le tablespace système (espace 0) même si innodb_file_per_table était activé. (Bogue #18635485)

InnoDB : Après la mise à niveau des versions 5.6.10 vers MySQL jusqu'à et y compris MySQL 5.6.18, InnoDB tenterait de renommer les tables auxiliaires de recherche en texte intégral obsolètes au démarrage du serveur, entraînant un échec d'assertion. (Bogue #18634201, Bogue #72079)

InnoDB : Dans de rares cas, le processus de purge tentait de supprimer un enregistrement d'index secondaire qui n'était pas marqué pour suppression, entraînant un index secondaire incohérent. (Bogue #18631496)

InnoDB : Après avoir exécuté OPTIMIZE TABLE sur une table InnoDB avec un index spatial, l'exécution d'une instruction SELECT qui utilise l'index spatial peut entraîner un blocage. (Bogue #18619945, Bug #72361)

Références : Ce problème est une régression de : Bug #13975225.

InnoDB : Au démarrage, avec innodb_file_per_table=ON , le thread de nettoyage de page déclencherait une assertion de débogage srv_get_active_thread_type() == SRV_NONE lorsqu'il rencontrait un thread maître actif. (Bogue #18598813)

InnoDB : InnoDB essaierait de fusionner un tampon de modification b-tree pour un tablespace d'annulation dédié. (Bogue #18593561)

InnoDB : Unistd.h inclus dans innodb.cmake pour activer les futex dans les versions de débogage. (Bogue #18522549, Bug #72225)

InnoDB : TRUNCATE TABLE écrirait des journaux redo au niveau de la page pendant l'étape DROP TABLE d'une opération TRUNCATE TABLE. (Bogue #18511398)

InnoDB : Une opération COMMIT liée à la recherche en texte intégral a entraîné une erreur de segmentation. (Bogue #18503734)

InnoDB : srv_active_wake_master_thread() a été appelé directement dans innobase_commit et innobase_prepare , réveillant le thread maître et incrémentant srv_activity_count . srv_active_wake_master_thread() ne doit être appelé qu'après avoir validé des transactions d'écriture, pas après des transactions en lecture seule ou des annulations. Ce correctif remplace également certains appels à srv_active_wake_master_thread() par des appels à ib_wake_master_thread() . (Bogue #18477009, Bogue #72137)

InnoDB : Un DB_LOCK_WAIT lors d'une vérification de clé étrangère a provoqué un marquage de suppression redondant, entraînant un échec d'assertion. (Bogue #18451287)

InnoDB : Avec UNIV_SYNC_DEBUG activé, un appel tardif à sync_check_enable() entraînerait un échec d'assertion m_enabled. (Bogue #18433658)

InnoDB : InnoDB écrirait dans le journal redo pour une opération IMPORT TABLESPACE avant la fin de l'importation de l'espace table. (Bogue #18424134)

InnoDB : L'InnoDB memcaché plugin appellerait plugin_del sans acquérir le mutex lock_plugin. Ce correctif de bogue corrige également une condition de concurrence dans ib_cursor_delete_row . (Bogue #18409840)

InnoDB : La fonction os_event_wait_time_low renvoyait parfois OS_SYNC_TIME_EXCEEDED avant que le temps de synchronisation ne se soit écoulé. (Bogue #18386498)

InnoDB : Lorsque les statistiques persistantes sont activées, la sortie SHOW TABLE STATUS et la colonne TABLE_ROWS de INFORMATION_SCHEMA.TABLES peuvent signaler un nombre incorrect de lignes de table pour les tables avec des pages stockées en externe. (Bogue #18384390)

InnoDB : L'exécution d'un SELECT sur une table partitionnée a provoqué une violation d'accès à la mémoire dans memcpy() . (Bogue #18383840)

Références : Voir aussi : Bug #18167648.

InnoDB : Une régression introduite par le correctif du bogue n° 18069105 pourrait entraîner une corruption de table et des assertions défaillantes. (Bogue #18368345)

Références : Ce problème est une régression de : Bug #18069105.

InnoDB : Le fichier de données n'a pas été ouvert avant l'appel de fil_fusionio_enable_atomic_write() , ce qui a entraîné un échec d'assertion. (Bogue #18368241)

InnoDB : Le correctif du bogue n° 17699331 a entraîné un taux élevé de création et de destruction de verrous en lecture/écriture, ce qui a entraîné une régression des performances. (Bogue #18345645, Bogue #71708)

Références : Ce problème est une régression de : Bug #17699331.

InnoDB : Améliorations de la qualité du code pour le sous-système de journalisation. (Bogue #18345004)

InnoDB : Ajout du mécanisme C++ ostream pour la journalisation des erreurs. (Bogue #18320915)

InnoDB : Suppression de la variable de code recv_max_parsed_page_no, qui n'était utilisée que dans un message d'erreur de diagnostic. (Bogue #18312967)

InnoDB : buf_pool->flush_rbt , qui est uniquement destiné à être utilisé pour la récupération, serait alloué pour la création de la base de données et jamais libéré. (Bogue #18253089)

InnoDB : Les appels à sched_getcpu provoqueraient des défauts de page. (Bogue #18225489)

InnoDB : ib_heap_resize n'a pas réussi à vérifier que new_size est supérieur ou égal à old_size avant d'appeler memcpy . (Bogue #18178915)

InnoDB : Après la récupération sur incident et avec UNIV_DEBUG activé, la purge a échoué avec un échec d'assertion buf_pool_from_bpage(bpage) == buf_pool. (Bogue #18154145)

InnoDB : Le code d'assertion dans buf_page_release_latch() dans buf0buf.ic était trop restrictif. (Bogue #17869571)

InnoDB : Pour chaque insertion, memset serait appelé trois fois pour allouer de la mémoire aux champs système. Pour réduire l'utilisation du processeur, les trois appels memset sont désormais combinés en un seul appel. (Bogue #17858679, Bug #71014)

InnoDB : Le correctif du bogue n°16418661 a ajouté une logique buf_flush_list() superflue au code de démarrage d'InnoDB. (Bogue #17798076, Bug #70899)

Références : Ce problème est une régression de : Bug #16418661.

InnoDB : Un problème de renommage des tables temporaires lors d'une opération ALTER TABLE déclencherait une assertion et imprimerait un avertissement dans le journal des erreurs. Les noms de tables temporaires n'étaient pas suffisamment uniques. (Bogue #17713871)

InnoDB : Les opérations ALTER TABLE sur place nécessitant une reconstruction de la table triaient l'index clusterisé même si l'ordre des clés primaires restait inchangé. Ce comportement provoquait une utilisation inutile de la table temporaire et des E/S. (Bogue #17657223)

InnoDB : Dans certaines circonstances, les verrous d'index de hachage adaptatifs ( btr_search_latch ) étaient persistants. Avec les verrous rw basés sur des éléments atomiques (verrous en lecture-écriture), les verrous d'index de hachage adaptatifs persistants sont inutiles et peuvent bloquer d'autres mises à jour d'index de hachage adaptatif. (Bogue #17554489, Bug #70216)

InnoDB : Une condition de concurrence dans fts_get_next_doc_id a entraîné des erreurs FTS_DOC_ID en double et Impossible de trouver l'index FTS_DOC_ID_INDEX dans la table de traduction d'index InnoDB. (Bogue #17447086, Bug #70311)

Références : Voir aussi : Bug #16469399.

InnoDB : L'activation du moniteur de table InnoDB entraînerait un échec d'assertion ib_table->stat_initialized. (Bogue #17039528, Bug #69641)

InnoDB : Les écritures de journalisation pour les champs BLOB volumineux et stockés en externe pourraient écraser le point de contrôle le plus récent. Le correctif 5.6.20 limite la taille des écritures de BLOB de journalisation à 10 % de la taille du fichier de journalisation. Le correctif 5.7.5 corrige le bogue sans imposer de limitation. Pour MySQL 5.5, le bogue reste une limitation connue. (Bogue #16963396, Bug #19030353, Bug #69477)

InnoDB : Le message du journal d'erreurs qui est imprimé sur CREATE TABLE lorsque le nombre de champs BLOB ou TEXT dépasse la limite de taille de ligne n'a pas fourni d'informations suffisantes. Le message d'erreur fournit désormais la taille de ligne maximale, la taille de ligne actuelle et le champ qui provoque le dépassement de la taille de ligne maximale. (Bogue #16874873, Bug #69336)

InnoDB : Une opération ALTER TABLE sur place sur une table avec une contrainte de clé étrangère rompue peut déclencher une assertion. (Bogue #16869435)

InnoDB : La fonction lock_number_of_rows_locked utilisait un vecteur de bits pour suivre le nombre de verrous d'enregistrement détenus par une transaction. Pour optimiser le reporting, le vecteur de bits a été remplacé par un simple compteur. (Bogue #16479309, Bug #68647)

InnoDB : L'insertion d'un enregistrement dans une table InnoDB avec une clé comprise entre la clé maximale d'une page complète et la clé minimale de la page « suivante » peut entraîner des divisions de page inutiles et des pages sous-remplies. Si le point d'insertion se trouve à la fin d'une page, InnoDB tente maintenant d'insérer à la page suivante avant de scinder la page. (Bogue #15923864, Bogue #67718)

InnoDB : Avec innodb_max_dirty_pages_pct=0, le vidage du pool de mémoire tampon ne serait pas lancé tant que le pourcentage de pages modifiées n'aurait pas atteint au moins 1 %, ce qui laisserait jusqu'à 1 % de pages modifiées non purgées. (Bogue #13029450, Bogue #62534)

InnoDB : En raison de différences dans l'ordre de la mémoire sur différents types de processeurs, certains indicateurs de verrouillage mutex et en lecture-écriture n'étaient pas lus de manière cohérente. (Bogue #11755438, Bogue #47213)

InnoDB : Le code d'assertion de débogage dans le fichier row0ins.cc ne tenait pas compte du mode exclusif partagé rw-lock (sx-lock), ce qui a entraîné un échec d'assertion. (Bogue #73534, Bug #19420253)

InnoDB : Avec foreign_key_checks=0 , InnoDB a permis la suppression d'un index requis par une contrainte de clé étrangère, plaçant la table dans une incohérente et provoquant l'échec de la vérification de la clé étrangère qui se produit lors du chargement de la table. InnoDB empêche désormais de supprimer un index requis par une contrainte de clé étrangère, même avec foreign_key_checks=0 . La contrainte de clé étrangère doit être supprimée avant de supprimer l'index de clé étrangère. (Bogue #70260, Bug #17449901)

Partitionnement : Lorsque l'indicateur index_merge_intersection (activé par défaut) ou l'indicateur index_merge_union était activé par le paramètre de la variable système Optimizer_switch, les requêtes renvoyaient des résultats incorrects lorsqu'elles étaient exécutées sur des tables partitionnées qui utilisaient le moteur de stockage MyISAM, ainsi que sur des tables InnoDB partitionnées sans clé. (Bogue #18167648)

Références : Voir aussi : Bug #16862316, Bug #17588348, Bug #17648468.

Partitionnement : Sélection à partir d'une table ayant plusieurs colonnes dans sa clé primaire et partitionnée par LIST COLUMNS( R ) , où R était la dernière colonne (la plus à droite) répertoriée dans la définition de clé primaire, a renvoyé un résultat incorrect. (Bogue #17909699, Bug #71095)

Réplication : Les messages d'erreur trompeurs ou déroutants ont été révisés, qui ont été produits dans les 2 cas suivants lors de l'utilisation mysqlbinlog avec l'option --raw :

Lorsque cette option a été utilisée avec --include-gtids .

Réplication : Après le correctif du bogue #16861624, la suppression d'un esclave multithread qui attendait un verrou de validation a entraîné l'échec d'une assertion de débogage. Ce correctif garantit qu'une telle situation ne peut pas se produire. (Bogue #19311260)

Réplication : Des erreurs temporaires liées à un thread de travail esclave qui tentait une nouvelle transaction étaient visibles dans SHOW SLAVE STATUS . Ce correctif garantit que les threads de travail esclaves ne stockent pas d'erreurs temporaires dans le statut d'esclave. (Bogue #19282301)

Réplication : Une longueur d'en-tête corrompue dans FORMAT_DESCRIPTION_LOG_EVENT peut provoquer l'arrêt inattendu du serveur. Cela était dû au fait que FORMAT_DESCRIPTION_LOG_EVENT était considéré comme non valide si la longueur de l'en-tête était trop courte. (Bogue #19145712)

Réplication : Suppression d'un verrou d'écriture inutile pris par une fonction interne lors de l'ajout d'un GTID à un ensemble de GTID, ce qui devrait améliorer les performances de la fonction et du code qui en dépend lors de telles opérations. (Bogue #18963555, Bogue #72977)

Réplication : La réplication semi-synchrone ne fonctionnait pas comme prévu lorsque les variables rpl_semi_sync_master_wait_no_slave et rpl_semi_sync_master_wait_for_slave_count étaient définies. Les valeurs des variables ont été modifiées, mais l'état interne associé n'a pas été mis à jour lors de l'initialisation. (Bogue #18835117, Bogue #18466390)

Réplication : RESET SLAVE ALL n'a pas effacé IGNORE_SERVER_IDS , bien que cette instruction devrait effacer toutes les valeurs définies par CHANGE MASTER TO . Désormais, RESET SLAVE ALL vide toujours la liste des ID de serveur à ignorer, chaque fois qu'il est exécuté. (Bogue #18816897)

Réplication : La même fonction interne a eu des effets qui ont causé trois problèmes similaires lors de la réinitialisation ou du démarrage des esclaves. Ces trois problèmes sont répertoriés ici :

RESET SLAVE définit automatiquement la période de pulsation ( Slave_heartbeat_period ) à sa valeur par défaut.

RESET SLAVE définit automatiquement SSL_VERIFY_SERVER_CERT sur la valeur par défaut.

Lorsqu'un serveur n'était pas configuré en tant qu'esclave (c'est-à-dire lorsqu'aucune instruction CHANGE MASTER TO n'avait encore été exécutée), l'échec ultérieur de START SLAVE était attendu mais avait pour effet secondaire involontaire de réinitialiser la période de pulsation à la valeur par défaut.

La fonction a été réécrite de telle sorte que le code affectant le rythme cardiaque ou l'utilisation du certificat SSL a été éliminé ou déplacé vers un emplacement plus approprié, éliminant les effets secondaires précédemment observés avec RESET SLAVE ou un échec de START SLAVE.

Dans le cadre de ce correctif, afin de pouvoir conserver les pulsations activées par défaut lors du changement de maître, si l'hôte et le port sont donnés mais que la période de pulsation n'est pas spécifiée dans une instruction CHANGE MASTER TO, nous la forçons à la valeur par défaut. (Bogue #18791604, Bogue #18778485, Bogue #18777899)

Réplication : mysqlbinlog --raw n'a pas vérifié les erreurs causées par les échecs d'écriture, ce qui pourrait entraîner une corruption silencieuse des journaux binaires. Maintenant, dans de tels cas, il s'arrête avec une erreur. (Bogue #18742916, Bogue #72597)

Réplication : Lors de la validation d'une transaction, un indicateur est désormais utilisé pour vérifier si un thread a été créé, plutôt que de vérifier le thread lui-même, qui utilise plus de ressources, en particulier lors de l'exécution du serveur avec master_info_repository=TABLE . (Bogue #18684222)

Références : Voir aussi : Bug #17967378.

Réplication : Lorsqu'un thread de travail esclave tentait d'exécuter une instruction trop volumineuse, l'erreur résultante provoquait un plantage. Maintenant, dans de tels cas, l'erreur est tronquée pour s'adapter à la taille du tampon. (Bogue #18563480)

Réplication : Les événements de rotation des journaux peuvent entraîner un déplacement incorrect de group_relay_log_pos au sein d'un groupe. Cela signifiait que, lorsque la transaction était réessayée, ou si le thread SQL était arrêté au milieu d'une transaction après une ou plusieurs rotations de journaux (par exemple, la transaction ou le groupe s'étendait sur plusieurs fichiers journaux de relais), une partie ou la totalité du groupe était ignoré en silence.

Ce problème a été résolu en corrigeant un problème dans la logique utilisée pour éviter de toucher les coordonnées du thread SQL lors de la mise à jour de la position du journal dans le cadre d'une rotation du journal de relais, ce qui permettait de mettre à jour les coordonnées du thread SQL sans utiliser un esclave multithread. , même au milieu d'un groupe. (Bogue #18482854)

Réplication : Lors de l'utilisation de GTID avec MASTER_AUTO_POSITION activé, si un thread d'E/S a été redémarré, il a échoué avec une erreur ER_GTID_NEXT_TYPE_UNDEFINED_GROUP en raison d'une transaction partielle n'étant pas correctement annulée avant de reprendre le thread d'E/S. Ce correctif garantit que la transaction partielle est correctement annulée. (Bogue #18472603)

Réplication : Lors de l'utilisation de la réplication basée sur les lignes, la mise à jour ou la suppression d'une ligne sur le maître qui n'existait pas sur l'esclave entraînait l'échec de l'esclave lorsqu'il tentait de traiter la modification. Ce problème s'est produit avec les tables InnoDB sans clé primaire. (Bogue #18432495, Bogue #72085)

Réplication : Un esclave multithread vérifie maintenant qu'un travailleur libre est disponible pour envoyer le prochain événement. Dans les versions précédentes, un esclave multithread plante avec une erreur de travail si le coordinateur de thread ne trouve pas de travailleur libre. Le crash a été causé lorsque le coordinateur n'a pas renvoyé un travailleur libre, par exemple si le coordinateur a été interrompu en même temps en utilisant STOP SLAVE . (Bogue #18363515)

Réplication : Lors de la réplication d'un maître MySQL 5.5 ou antérieur vers un esclave MySQL 5.6 ou ultérieur, la colonne SOURCE_UUID de la table performance_schema.replication_connection_status de l'esclave contenait des données aléatoires. Maintenant, dans de tels cas, SOURCE_UUID est laissé vide. (Bogue #18338203)

Réplication : Lors de l'initialisation du journal de relais, le contexte du thread a été utilisé comme indicateur pour la reconstruction de l'ensemble GTID récupéré, une opération qui ne dépend pas de ce paramètre. Cela pouvait être problématique si l'initialisation du journal de relais était appelée dans un autre contexte que le scénario de réplication hérité. Si l'appel était fait dans un contexte où le contexte du thread était toujours présent, cela empêchait la reconstruction de l'ensemble. L'inverse peut également se produire lorsque le contexte du thread n'est pas présent, ce qui entraîne une double exécution de l'initialisation.

Pour éviter de tels problèmes, l'indicateur de contexte de thread est remplacé par un nouvel indicateur qui permet la reconstruction dans tous les contextes mais empêche les invocations multiples. (Bogue #18337036)

Réplication : Lorsque mysqlbinlog a traité plusieurs fichiers journaux binaires dans un seul fichier de sortie, ce fichier n'était pas dans un état utile pour la récupération à un moment donné, lorsqu'il a échoué avec l'erreur, Lorsque @@SESSION.GTID_NEXT est défini sur un GTID, vous devez explicitement définir à une valeur différente après un COMMIT ou un ROLLBACK. Veuillez consulter la page de manuel de la variable GTID_NEXT pour une explication détaillée. @@SESSION.GTID_NEXT actuel est ' xyz '. Lorsque mysqlbinlog traite un journal binaire contenant des GTID, il génère des instructions SET gtid_next, mais gtid_next est défini sur undefined chaque fois qu'une validation se produit, cela laisse gtid_next indéfini lorsque le serveur a fini de traiter la sortie de mysqlbinlog . Lorsque le fichier journal binaire suivant a démarré avec une ou plusieurs instructions ou transactions anonymes, la combinaison de gtid_next étant laissée indéfinie à la fin du premier journal binaire et du deuxième journal binaire contenant des transactions anonymes à l'erreur décrite précédemment (Erreur 1837, ER_GTID_NEXT_TYPE_UNDEFINED_GROUP ) .

Pour résoudre ce problème, maintenant, chaque fois que mysqlbinlog rencontre cette situation, il insère SET gtid_next = AUTOMATIC si nécessaire pour éviter de laisser le journal binaire précédent avec gtid_next non défini.

De plus, à la suite de ce correctif, mysqlbinlog ne génère plus d'informations sur les variables de session pour chaque journal binaire maintenant, cette valeur n'est imprimée qu'une seule fois à moins qu'elle ne change. (Bogue #18258933, Bogue #71695)

Réplication : Les guillemets n'étaient pas toujours gérés correctement par LOAD DATA lorsqu'ils étaient écrits dans le journal binaire. (Bogue #18207212, Bogue #71603)

Réplication : Changer master_info_repository entre TABLE et FILE pourrait produire des valeurs en double dans la colonne Replicate_Ignore_Server_Ids de la sortie de SHOW SLAVE STATUS et la colonne Ignored_server_ids de la table mysql.slave_master_info. Cela peut être dû au fait que la liste des identifiants stockés en interne par le serveur n'était pas toujours triée avant de rechercher les doublons lors de l'insertion de nouvelles valeurs dans la liste. Désormais, la liste des identifiants de serveur à ignorer est toujours triée, avant d'effectuer cette vérification. (Bogue #18192817, Bogue #18593479, Bogue #18920203)

Réplication : Dans certains cas, le serveur a mal géré les déclencheurs et les procédures stockées qui ont tenté de modifier d'autres tables lorsqu'elles ont été appelées par CREATE TABLE . SÉLECTIONNER. Ceci est maintenant géré correctement comme une erreur. (Bogue #18137535)

Réplication : Les options REPLICATE_WILD_DO_TABLE et REPLICATE_WILD_IGNORE_TABLE pour CHANGER LE FILTRE DE RÉPLICATION pourraient être utilisées avec des valeurs ne contenant aucun point ( . ), même si les valeurs de ces options doivent être au format nom_base . nom_table .. (Bogue #18095449)

Réplication : Lorsqu'il est utilisé sur une table utilisant un moteur de stockage transactionnel, un échec de TRUNCATE TABLE est toujours écrit dans le journal binaire et donc rejoué sur l'esclave. Cela pourrait entraîner une incohérence lorsque le maître conservait des données qui avaient été supprimées sur l'esclave.

Maintenant, dans de tels cas, TRUNCATE TABLE n'est consigné que lorsqu'il s'exécute avec succès. (Bogue #17942050, Bug #71070)

Réplication : À partir de MySQL 5.6.20, lorsqu'une valeur AUTO_INCREMENT spécifiée par l'utilisateur tombe en dehors de la plage entre la valeur AUTO_INCREMENT actuelle et la somme des valeurs actuelles et du nombre de lignes affectées, elle est répliquée correctement. Dans les versions précédentes, une erreur était générée par l'esclave même si la valeur AUTO_INCREMENT spécifiée par l'utilisateur sortait de la plage. (Bogue #17588419, Bug #70583)

Réplication : Lorsque le thread d'E/S s'est reconnecté à un maître à l'aide de GTID et d'esclaves multithreads au milieu d'une transaction, il n'a pas réussi à abandonner la transaction, laissant une transaction partielle dans le journal du relais, puis récupérant la même transaction. Cela s'est produit lors de l'exécution d'une rotation du journal de relais. Désormais, lors de la reconnexion, le serveur vérifie avant de faire pivoter le journal dans de tels cas et attend d'abord la fin de toute transaction en cours. (Bogue #17326020)

Réplication : Sous Windows, mysqldump échouait si le fichier journal des erreurs était supprimé (manquant) du serveur MySQL actif. (Bogue #17076131)

Réplication : Lorsque le journal binaire a été tourné en raison de la réception d'un signal SIGHUP, le nouveau journal binaire ne contenait pas l'événement Previous_gtid_event requis pour le traitement ultérieur des événements GTID de ce journal binaire. Désormais, lorsque SIGHUP est reçu, des mesures sont prises pour s'assurer que le serveur écrit l'événement Previous_gtid_event nécessaire dans le nouveau journal avant d'écrire les événements GTID dans le nouveau journal. (Bogue #17026898)

Réplication : L'indicateur CLIENT_REMEMBER_OPTIONS pour les connexions esclaves compressées n'est plus réinitialisé et toutes les options sont conservées. Cela restaure la fonctionnalité de toutes les options des connexions esclaves compressées. (Bogue #72901, Bogue #18923691, Bogue #73324, Bogue #19244772)

Réplication : Lors de l'utilisation de la réplication basée sur les lignes, la définition de la variable slave_rows_search_algorithms d'un esclave sur HASH_SCAN provoquait une erreur ER_KEY_NOT_FOUND même si cet enregistrement existait dans la couche de stockage. Ce correctif garantit que la clé unique de chaque enregistrement est correctement conservée et qu'une telle situation ne se produit pas. (Bogue #72788, Bug #18860225)

Réplication : Lors de l'utilisation de la réplication basée sur les lignes, l'exécution d'une longue transaction impliquant un grand nombre d'événements pouvait déclencher une erreur de mémoire insuffisante (MOO) si la structure de la table de l'esclave n'était pas compatible avec la structure de la table du maître.Une telle situation incompatible pourrait se produire si la table sur l'esclave avait été modifiée manuellement, ou lors de la réplication entre différentes versions de MySQL qui ont des types de données différents. Cette erreur de MOO était due au fait que les tables temporaires virtuelles créées pour la conversion de ligne n'étaient pas libérées avant la fin de la transaction, ce qui posait problème lors de la réplication d'un grand nombre d'événements.

A partir de cette version, ces tables virtuelles sont correctement libérées lors du processus de conversion. (Bogue #72610, Bug #18770469)

Références : Voir aussi : Bug #19692387.

Réplication : Les messages d'erreur générés lorsqu'un UUID de serveur en double provoque des problèmes lors de la réplication ont été améliorés. L'erreur esclave identifie maintenant l'UUID du serveur en double et l'erreur maître identifie le thread zombie qui a été tué. (Bogue #72578, Bug #18731211)

Réplication : Lorsqu'un groupe d'événements était réparti sur plusieurs fichiers journaux de relais, un esclave pouvait identifier de manière incorrecte les limites du groupe d'en-tête GTID. Cela signifiait que lorsqu'une transaction était réessayée, ou si le thread SQL était arrêté au milieu d'une transaction après quelques rotations, le Gtid_log_event était ignoré en silence sur l'esclave et la transaction était enregistrée avec le GTID de l'esclave. Ce problème a également eu un impact sur l'utilisation de START SLAVE UNTIL MASTER_LOG_POS = log_pos avec les GTID activés. Si log_pos était au milieu d'une transaction, l'événement Gtid_log_event n'a pas été correctement détecté comme début de la transaction et la réplication s'est arrêtée avant cet événement. Avec ce correctif, les threads détectent correctement qu'ils font partie d'un groupe, et cela est utilisé pour vérifier si un Gtid_log_event fait partie d'une transaction. (Bogue #72313, Bug #18652178, Bug #18306199)

Réplication : Lorsque gtid_mode=ON , et qu'une transaction est filtrée sur l'esclave, le GTID de la transaction est toujours enregistré sur l'esclave en tant que transaction « vide » (constitué d'un GTID suivi immédiatement de BEGIN puis COMMIT ). Cela est nécessaire pour éviter que la transaction ne soit retransmise la prochaine fois que l'esclave se reconnecte ou est impliqué dans un basculement. Le correctif actuel résout deux problèmes liés à ces transactions « vides » :

Aucune transaction vide n'a été générée pour les instructions CREATE TEMPORARY TABLE ou DROP TEMPORARY TABLE.

Si l'esclave utilisait un filtre de base de données (option --replicate-do-db ou --replicate-ignore-db), aucune transaction vide n'était générée.

(Bogue #71376, Bug #18095502, Bug #18145032)

Réplication : Les applications clientes doivent pouvoir définir l'indicateur BINLOG_DUMP_NON_BLOCK dans le paquet d'établissement de liaison initial ( COM_BINLOG_DUMP ). Les clients se connectant à un serveur émettant un COM_BINLOG_DUMP avec l'indicateur non défini n'obtiennent pas d'EOF lorsque le serveur a envoyé le dernier événement dans le journal binaire, ce qui provoque le blocage de la connexion. Ce drapeau, qui a été supprimé par erreur dans MySQL 5.6.5, est maintenant restauré dans la version actuelle.

Dans le cadre de ce correctif, une nouvelle option --connection-server-id est ajoutée à mysqlbinlog . Cette option peut être utilisée par le client pour tester un serveur MySQL pour la présence de ce problème. (Bogue #71178, Bug #18000079)

Réplication : Sur un maître qui utilise la réplication semi-synchrone, où rpl_semi_sync_master_wait_no_slave est activé et rpl_semi_sync_master_timeout est défini sur un délai d'attente long, la suppression du thread d'E/S peut entraîner le blocage du serveur lors de l'arrêt. Ce correctif garantit que si le thread de vidage détecte qu'aucun esclave semi-synchrone n'est connecté au maître, le paramètre de rpl_semi_sync_master_wait_no_slave est ignoré et l'arrêt se déroule correctement. (Bogue #71047, Bug #17879675)

Réplication : La désinstallation et la réinstallation des plug-ins de réplication semi-synchrone alors que la réplication semi-synchrone était active provoquait des échecs de réplication. Les plugins vérifient maintenant s'ils peuvent être désinstallés et produisent une erreur si la réplication semi-synchrone est active. Pour désinstaller le plugin côté maître, il ne doit y avoir aucun esclave semi-synchrone. Pour désinstaller le plug-in côté esclave, aucun thread d'E/S semi-synchrone ne doit être en cours d'exécution. (Bogue #70391, Bug #17638477)

Réplication : Lors de l'utilisation de la réplication semi-synchrone, si la position du journal binaire était modifiée en une position future sur un esclave, une erreur d'assertion était générée sur le maître. Ce correctif garantit que dans une telle situation, la position future est correctement acquittée et qu'une erreur est plutôt générée sur l'esclave. (Bogue #70327, Bug #17453826)

Réplication : La réplication de tables contenant des champs de type temporel (tels que TIMESTAMP , DATETIME et TIME ) à partir de différentes versions de MySQL a échoué en raison de types TIMESTAMP incompatibles. Le format fractionnaire TIMESTAMP ajouté dans MySQL 5.6.4 n'était pas correctement converti. Vous pouvez désormais répliquer correctement un TIMESTAMP dans l'un ou l'autre format en fonction de la variable slave_type_conversions. (Bogue #70124, Bug #17532932)

Réplication : Un groupe de threads impliqués dans l'acquisition de verrous pouvait se bloquer lorsque les événements suivants se produisaient :

Le thread de vidage se reconnecte de l'esclave sur le maître, un nouveau thread de vidage essaie de tuer les threads de vidage zombie ayant acquis les LOCK_thd_data du thread, il est sur le point d'acquérir LOCK_log .

Thread d'application exécutant les journaux binaires d'affichage, ayant acquis LOCK_log et sur le point d'acquérir LOCK_index .

Le thread d'application exécutant PURGE BINARY LOGS ayant acquis LOCK_index , il est sur le point d'acquérir LOCK_thread_count .

Thread d'application exécutant SHOW PROCESSLIST (ou SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST ), ayant acquis LOCK_thread_count et sur le point d'acquérir LOCK_thd_data du thread de vidage zombie.

Cela conduit au blocage des 4 threads dans le même ordre que les threads ont été répertoriés ici.

Ce problème survient car il existe des règles de tri pour LOCK_log et LOCK_index , ainsi que des règles pour trier LOCK_thread_count et LOCK_thd_data , mais il n'y a pas de règles pour trier ces deux ensembles de verrous. C'est parce que la fonction interne mysqld_list_processes() invoquée par SHOW PROCESSLIST a acquis LOCK_thread_count pour la durée de vie complète de la fonction ainsi que l'acquisition et la libération des LOCK_thd_data de chaque thread. Maintenant, cette fonction prend une copie des threads de la liste globale des threads et effectue son parcours sur ceux-ci, et seulement après avoir relâché LOCK_thread_count . Au cours de cette traversée, la suppression de la liste globale des threads est bloquée à l'aide de LOCK_thd_remove de sorte que les copies qui seraient autrement détruites par la suppression restent valides pendant la traversée. L'ordre de verrouillage suivant ce correctif est affiché ici :

Références : Voir aussi : Bug #73475, Bug #19364731, Bug #19365180.

Réplication : Lorsqu'un thread SQL qui attendait un verrou de validation a été tué et redémarré, une transaction a été ignorée sur l'esclave. Ce correctif garantit que les positions de thread sont correctement conservées et que les transactions reprennent à la position correcte. (Bogue #69873, Bug #17450876)

Microsoft Windows: Pour faciliter l'analyse des pannes sous Windows, plus d'informations ont été ajoutées au fichier de base qui est écrit sur mysqld abandonner lorsque l'option core-file est activée. (Bogue #14041454)

Lorsque la prise en charge de DTrace est activée, certaines autres options de compilation peuvent entraîner l'échec de la génération. (Bogue #19506247)

Le code client yaSSL n'a pas validé la taille de cryptage ou la longueur de l'ID de session, ce qui pourrait entraîner la fermeture du client. (Bogue #19463277, Bug #19463565)

Avant les opérations fsync, le serveur signale une attente, mais il signale une attente de verrouillage de table plutôt qu'une attente de synchronisation. Il s'agit d'un problème mineur, pouvant entraîner des statistiques incorrectes du plugin de pool de threads. (Bogue #19428231)

L'optimiseur peut émettre une assertion en raison d'une mauvaise gestion du mappage de table lors du tri d'une table temporaire interne. (Bogue #19416826)

yaSSL pourrait échouer à la préautorisation si le client fournissait des longueurs de tampon inexactes. (Bogue #19370676, Bug #19355577)

L'utilisation de Multi-Range Read (MRR) pour l'accès aux tables peut entraîner une fuite des descripteurs de table instrumentés Performance Schema. (Bogue #19301539)

Pour les recherches en texte intégral InnoDB, les caractères multi-octets gb10830 non valides peuvent entraîner la sortie du serveur. (Bogue #19233075)

La concurrence entre les threads peut entraîner un échec du délai d'attente lors de la rotation du fichier journal d'audit. (Bogue #19184973)

Sous Windows, sql_yacc.cc et sql_yacc.h ont été générés deux fois pendant le processus de génération. Cela peut entraîner un échec de la compilation si les processus parallèles sont autorisés. (Bogue #19060850, Bug #27470071, Bug #89482)

Les fonctions répétitives appelées comme arguments de ExtractValue() n'étaient pas toujours gérées correctement. (Bogue #19051306)

Pour les grands ensembles, EXPORT_SET() pourrait produire des résultats indéfinis ou provoquer la sortie du serveur. (Bogue #19048609)

Des données utf16 non valides peuvent empêcher le serveur de répondre. (Bogue #18937504)

LPAD() et RPAD() pouvaient provoquer une sortie du serveur si l'argument de chaîne de remplissage n'était pas correctement formé. (Bogue #18935421)

L'optimiseur peut créer une colonne de longueur nulle pour une table temporaire, provoquant l'arrêt du serveur. (Bogue #18928848)

Dans les versions de débogage, certaines requêtes de plage peuvent provoquer un échec d'assertion. (Bogue #18921626)

Une copie incorrecte des chaînes de requête entre les structures de données Prepared_statement et THD peut entraîner une sortie du serveur. (Bogue #18920075)

L'instrumentation de mémoire du schéma de performances n'a pas respecté l'indicateur ENABLED dans la table setup_instruments ou les consommateurs dans la table setup_consumers. Cela a été corrigé, avec pour résultat que les statistiques inutiles ne sont pas collectées et les frais généraux sont réduits. (Bogue #18900309)

Lorsqu'un SELECT incluait une table dérivée dans une jointure dans sa liste FROM et que la liste SELECT incluait COUNT(DISTINCT) , COUNT() renvoyait 1 même si le jeu de résultats sous-jacent était vide. (Bogue #18853696)

Références : Ce problème est une régression de : Bug #11760197.

L'échec de la conversion des dates « zéro » en mode SQL strict pourrait entraîner une sortie du serveur. (Bogue #18840123)

Les opérations modulo sur les valeurs DECIMAL peuvent dans certains cas déborder et provoquer la sortie du serveur. (Bogue #18839617)

L'activation de la trace de l'optimiseur peut entraîner une sortie du serveur pour les requêtes avec une sous-requête dans une clause HAVING. (Bogue #18791851)

Les fonctions SHA et MD5 ont échoué pour les opérations utilisant le jeu de caractères de nom de fichier interne et pourraient entraîner une sortie du serveur. (Bogue #18786138)

De gros arguments passés à mysqldump pourrait entraîner un débordement de la mémoire tampon et la sortie du programme. (Bogue #18779944)

Si une sous-requête matérialisée est lue à partir d'une vue et contient une sous-requête interne ayant une référence externe à une colonne de la vue, les résultats peuvent être incorrects. (Bogue #18770217)

Passer de mauvais arguments à SHA2() pourrait provoquer une sortie du serveur. (Bogue #18767104)

Les opérations spatiales sur les tables InnoDB pouvaient échouer en tentant d'accéder à des statistiques d'index inexistantes. (Bogue #18743725)

ORDER BY d'une fonction SIG à laquelle des arguments non valides ont été attribués peut entraîner la fermeture du serveur. (Bogue #18701868)

Le code de traitement du jeu de caractères gb18030 comportait une assertion trop stricte pour les caractères non valides à un seul caractère. (Bogue #18700668)

Après un changement de métadonnées, un déclencheur repréparé peut entraîner une sortie du serveur ou élaguer une partition incorrecte. (Bogue #18684393)

mysql_secure_installation options ignorées définies après une option non reconnue. (Bogue #18659533)

VALIDATE_PASSWORD_STRENGTH() pourrait entrer dans une boucle infinie pour certains arguments. (Bogue #18636291)

ALTER TABLE sur une table partitionnée peut entraîner l'écriture du mauvais moteur de stockage dans le fichier .frm de la table et son affichage dans SHOW CREATE TABLE . (Bogue #18618561)

Le serveur peut ne pas réussir à repréparer correctement les déclencheurs faisant référence à une autre table après que cette table a été tronquée. (Bogue #18596756, Bogue #72446, Bogue #18665853)

Les indicateurs du compilateur n'étaient pas transmis à DTrace, ce qui causait des problèmes pour les versions 32 bits compilées de manière croisée sur des plates-formes 64 bits. (Bogue #18593044)

Pour les conditions de la forme t.key NOT IN (c1, c2, . ) , si un ou plusieurs des c1 , c2 étaient NULL , l'optimiseur générait des prédicats de plage incorrects, produisant éventuellement des résultats incorrects.

L'optimiseur de plage construirait des prédicats pour les in-lists vides (car les valeurs NULL sont supprimées de NOT IN (in-list) ). (Bogue #18556403, Bogue #18715670)

Après la conversion d'une table temporaire interne en mémoire en disque, le serveur peut utiliser un pointeur vers l'ancienne table, ce qui entraîne une sortie du serveur. (Bogue #18535226)

Pour les requêtes exécutées à l'aide de Loose Index Scan, des estimations de coûts incorrectes pourraient être produites si les statistiques d'index n'étaient pas disponibles. (Bogue #18497308)

La définition de default_storage_engine sur une valeur incorrecte pourrait entraîner une défaillance du serveur ultérieurement. (Bogue #18487724)

Dans les versions de débogage, MAKE_SET() dans une clause GROUP BY a soulevé une assertion. (Bogue #18487060)

Dans les versions de débogage, l'optimisation des sous-requêtes peut être trop agressive pour soulever une assertion. (Bogue #18486607)

Dans les versions de débogage, une opération qsort sur les valeurs décimales peut déclencher une assertion. (Bogue #18486249)

Pour les versions de débogage, une assertion a été émise pour les tentatives d'utilisation d'un curseur dans une routine stockée pour récupérer une grande valeur ( INT ) qui ne peut pas tenir dans une variable ( TINYINT ). (Bogue #18484649)

MOD pour de très petits arguments décimaux à droite pourrait provoquer une sortie du serveur. (Bogue #18469276)

Avec la variable système max_heap_table_size définie sur une valeur élevée (20 Go), la création d'une table temporaire ou d'une table à l'aide du moteur de stockage MEMORY a entraîné une sortie du serveur. (Bogue #18463911)

mysql_session_track_get_first() et mysql_session_track_get_next() ont renvoyé des informations uniquement lorsque l'argument de type était SESSION_TRACK_SYSTEM_VARIABLES , et ont renvoyé des informations pour tous les types, pas seulement SESSION_TRACK_SYSTEM_VARIABLES . Maintenant, ils renvoient des informations du type demandé et uniquement de ce type. (Bogue #18463441)

Pour mysql_upgrade , la spécification du fichier --defaults-extra-file avec un fichier inexistant provoquait une erreur de segmentation sur certaines plates-formes. (Bogue #18443096)

L'affectation de certaines valeurs à la variable système session_track_system_variables peut entraîner la sortie du serveur. (Bogue #18405677)

mysql_install_db pourrait se bloquer lors de la lecture de /dev/random pour générer un mot de passe root aléatoire. (Bogue #18395378)

EXPLAIN FOR CONNECTION a affiché une valeur de filtrage incorrecte pour les requêtes de plage dynamique. (Bogue #18395059)

La bibliothèque cliente inclut désormais un appel à X509_verify_cert_error_string() dans le code de vérification du certificat SSL, pour être plus robuste dans la détection des certificats invalides. (Bogue #18384260)

Les requêtes qui utilisent AES_ENCRYPT() , AES_DECRYPT() ou RANDOM_BYTES() ne peuvent pas être mises en cache mais ont été autorisées à entrer dans le cache de requêtes. (Bogue #18383169)

Si MySQL a été compilé avec l'option -DINSTALL_LIBDIR=lib64, mysql_config ne fonctionnait pas si le package MySQL était décompressé dans un emplacement avec un préfixe d'installation différent. Aussi, mysql_config ne fonctionnait pas pour certaines versions RPM car il utilisait un préfixe d'installation incorrect. (Bogue #18382225)

Le code d'enregistrement du plug-in dans le serveur intégré (compilé sans le schéma de performance) a échoué pour les plug-ins compilés avec le schéma de performance. (Bogue #18363910)

Pour les index sur les préfixes ou les colonnes de chaînes de caractères, une corruption d'index peut se produire pour l'affectation de données binaires à la colonne en raison d'un comptage de caractères incorrect. (Bogue #18359924)

Le HAVE_IB_LINUX_FUTEX Cfaire la vérification a échoué en raison d'un fichier d'inclusion manquant. (Bogue #18353271)

Après une réorganisation du code dans MySQL 5.7.4, ORDER BY pour les instructions UPDATE à plusieurs tables a été ignoré. (Bogue #18352634)

L'ajout dans MySQL 5.7.4 d'informations sur l'état de la session au paquet OK du protocole client/serveur a fait que le membre mysql->info a manqué un terminateur null de fin. (Bogue #18349102)

Une liaison incorrecte des caches de jointure par l'optimiseur peut entraîner une sortie du serveur. (Bogue #18335908)

Dans les versions de débogage, le manque d'initialisation appropriée des objets décimaux provoquait la levée d'une assertion. (Bogue #18335446)

UNCOMPRESSED_LENGTH() pourrait renvoyer NULL alors qu'il n'aurait pas dû. (Bogue #18335269)

Sous Windows, certains cas de test se sont déroulés trop lentement en raison de mysqltest ne teste pas correctement l'arrêt du serveur. (Bogue #18330694)

La commande COM_RESET_CONNECTION n'a pas réinitialisé certaines variables système de session : rand_seed1 , rand_seed2 , timestamp . De plus, il n'a pas effacé les avertissements et, bien qu'il ait réinitialisé la variable de profilage, il n'a pas réinitialisé les informations de profilage. (Bogue #18329348, Bogue #18329560, Bogue #18328396, Bogue #18329452)

Certaines requêtes INFORMATION_SCHEMA peuvent entraîner une sortie du serveur. (Bogue #18319790)

EXPLAIN pour certaines requêtes en texte intégral pourrait soulever une assertion. (Bogue #18313651)

Des scripts spécifiques à Solaris ont été inclus et installés par des packages non-Solaris. (Bogue #18305641)

DELETE n'est pas autorisé sur les vues définies en tant que jointures sur les tables de base. Cependant, MySQL a autorisé à tort REPLACE (qui est comme une combinaison de DELETE et INSERT ) sur de telles vues. (Bogue #18286777)

Pour les versions de débogage, un caractère 0x00 dans une chaîne de requête de texte intégral qui utilisait le classement ujis_japanese_ci , utf8mb4_turkish_ci ou eucjpms_bin pourrait déclencher une assertion. (Bogue #18277305)

innobase_strnxfrm() a écrit un octet de trop. (Bogue #18277082)

Sous Windows, l'utilisation de gb18030_unicode_520_ci a provoqué une sortie du serveur. (Bogue #18271429)

Les macros internes probable () et improbable () étaient en conflit avec les symboles Boost. Pour résoudre ce problème, les macros ont été converties en fonctions en ligne. (Bogue #18242233)

Si le côté gauche d'un prédicat IN était une sous-requête scalaire mais ne renvoyait aucune ligne, le serveur pouvait se fermer. (Bogue #18223655, Bogue #18447874)

Pour les requêtes impliquant un AND de deux plages de géométrie, l'optimiseur pouvait décider qu'aucun index n'était utilisable mais essayer de l'utiliser quand même, ce qui entraînerait une sortie du serveur. (Bogue #18220153)

La vérification des arguments pour un appel memmove() dans my_net_read() a été améliorée. (Bogue #18184793)

mysql_upgrade invoqué le mysql et les clients mysqlcheck et les arguments de la commande pourraient être visibles par d'autres processus. Ce problème est résolu par la réimplémentation de mysql_upgrade pour communiquer directement avec le serveur, un changement décrit ailleurs dans ces notes de version. (Bogue #18180398)

Le code yaSSL avait une erreur un par un dans le décodage du certificat qui pouvait provoquer un débordement de la mémoire tampon.

Le code yaSSL avait un opendir() sans un closedir() correspondant. (Bogue #18178997, Bogue #17201924)

EXPLAIN sur une requête avec une sous-requête EXISTS contenant un UNION pourrait provoquer une sortie du serveur. Les exécutions multiples d'un EXPLAIN préparé sur une UNION de sous-requêtes pourraient entraîner une sortie du serveur. (Bogue #18167356)

mot de passe mysqladmin masqué l'ancien mot de passe donné sur la ligne de commande, mais pas le nouveau mot de passe. (Bogue #18163964)

Pour les tables InnoDB, les requêtes booléennes en texte intégral pour les termes se terminant par * peuvent renvoyer des résultats incorrects. (Bogue #18128757)

Pour les transactions XA, -1 peut être affecté comme partie d'ID de format d'une valeur XID, ce qui entraîne une mauvaise gestion (blocage ou sortie du serveur) des instructions XA simultanées. (Bogue #18107853)

La bibliothèque cliente peut entraîner la fermeture des clients en raison d'un mappage incorrect du numéro d'erreur client avec le message correspondant, si une réallocation de la mémoire tampon de paquets se produit. (Bogue #18080920)

Pour les requêtes en texte intégral sur les tables InnoDB, les tentatives d'accès aux ID de documents supprimés peuvent entraîner une sortie du serveur. (Bogue #18079671)

L'optimiseur peut calculer une valeur de coût négative lors de la construction d'un plan d'exécution pour les requêtes de table MERGE. (Bogue #18066518)

L'exécution d'une sous-requête corrélée sur une table ARCHIVE qui a une colonne AUTO_INCREMENT a provoqué le blocage du serveur. (Bogue #18065452)

L'appel de mysql_get_server_version() avec un argument de gestionnaire de connexion invalide a provoqué la fermeture du client. Maintenant, il renvoie 0 et signale une erreur CR_COMMANDS_OUT_OF_SYNC. (Bogue #18053212)

Les fichiers temporaires MyISAM pourraient être utilisés pour monter une attaque d'exécution de code. (Bogue #18045646)

Si l'optimiseur choisissait d'effectuer une analyse d'index, dans certains cas, il pourrait choisir un index non couvrant plutôt qu'un index couvrant. (Bogue #18035906)

Le Cfaire L'option -DWITHOUT_PARTITION_STORAGE_ENGINE=1 n'a pas fonctionné. Dans le cadre de la résolution de ce problème, une syntaxe préférée pour la désactivation des moteurs de stockage a été implémentée. La syntaxe -DWITH_ moteur _STORAGE_ENGINE=0 est maintenant préféré à -DWITHOUT_ moteur _STORAGE_ENGINE=1 . Par exemple, utilisez :

La bibliothèque cliente C pouvait fuir de la mémoire lorsque des plug-ins clients étaient utilisés. (Bogue #17933308)

Pour les versions de débogage, DROP FUNCTION avec un nom de fonction trop long a soulevé une assertion. (Bogue #17903490)

Un déclencheur BEFORE UPDATE pourrait insérer NULL dans une colonne NOT NULL. (Bogue #17864349)

Une requête UNION ALL avec SQL_CALC_FOUND_ROWS et une LIMIT avec un décalage pour un bloc de requête a signalé un nombre incorrect de lignes trouvées. (Bogue #17833261)

Pour les versions de débogage, une instruction DELETE avec une sous-requête qui a renvoyé plusieurs lignes dans un contexte nécessitant une sous-requête scalaire pourrait déclencher une assertion de zone de diagnostic. (Bogue #17787664)

L'utilisation d'une référence externe dans une clause GROUP BY ou ORDER BY dans une sous-requête peut entraîner l'arrêt du serveur. (Bogue #17748273)

Pour les requêtes sélectionnées dans la table de schéma de performances events_statements_current, l'ajout d'une clause ORDER BY peut produire des résultats incorrects. (Bogue #17729044)

Un blocage (rare) peut se produire entre LOCK_thd_data et le mutex InnoDB trx_sys. Un thread pouvait lire une chaîne de requête pendant qu'elle était supprimée par un autre thread. (Bogue #17606098)

Sous Windows, l'appel à mysql_thread_init() sans mysql_init() provoquait la fermeture du client. les fenêtres. Maintenant, il renvoie un résultat différent de zéro car c'est une erreur d'appeler mysql_thread_init() avant que la bibliothèque cliente ne soit initialisée avec mysql_library_init() . (Bogue #17514920)

Pour REPLACE sur une vue, une ligne remplacée dans une vue peut entrer en conflit avec une ou plusieurs lignes de la table de base, dont certaines peuvent ne pas être accessibles par la vue. Dans certains cas, les lignes inaccessibles par la vue pourraient être remplacées. (Bogue #17487701)

mysqldump pourrait créer des définitions de table dans le fichier de vidage, ce qui a entraîné des erreurs Trop de colonnes lors du rechargement du fichier de vidage. (Bogue #17477959)

L'utilisation de LOAD DATA pour charger des données de longueur fixe dans une vue peut entraîner l'arrêt du serveur. (Bogue #17458965)

La trace de l'optimiseur pouvait entraîner une sortie du serveur dans les cas où une sous-requête était transformée. (Bogue #17458054)

Les instructions UPDATE qui modifiaient les index de texte intégral pouvaient entraîner l'arrêt du serveur. (Bogue #17457755)

Envoi d'un signal SIGQUIT ou SIGINT à mysql pourrait entraîner une erreur de double libre ou de corruption de la glibc. (Bogue #17297324)

Un serveur peut avoir son fichier socket repris par un second serveur écoutant sur un port TCP/IP différent mais le même fichier socket. Le fichier socket serait également dissocié par l'arrêt normal du deuxième serveur. Pour éviter cela, le serveur utilise désormais un fichier de verrouillage avec le même nom que le fichier de socket et un suffixe .lock. (Par exemple, /tmp/mysql.sock a un fichier de verrouillage de /tmp/mysql.sock.lock .) Le fichier de verrouillage contient l'ID de processus du processus serveur qui a créé le fichier socket. (Bogue #17286856)

Si une requête avait à la fois MIN()/MAX() et fonction_agrégat (DISTINCT) (par exemple, SUM(DISTINCT) ) et a été exécuté à l'aide de Loose Index Scan, les valeurs de résultat de MIN()/MAX() ont été définies de manière incorrecte. (Bogue #17217128)

Pour les instructions UNION, la valeur des lignes examinées a été calculée de manière incorrecte. Cela se manifestait par des valeurs trop élevées pour la colonne ROWS_EXAMINED des tables d'instructions du schéma de performances (telles que events_statements_current ). (Bogue #17059925)

Lors de la jointure d'une grande table sans index à un certain nombre de petites tables avec des index, l'optimiseur a choisi de joindre la grande table en tant que dernière table, provoquant un grand nombre de balayages de grandes tables. (Bogue #16838146)

Les arguments du constructeur de ligne à INTERVAL() pourraient provoquer une sortie du serveur. (Bogue #16439419)

Une assertion peut être levée lors de la création d'un index sur un préfixe d'une colonne TINYBLOB ou GEOMETRY dans une colonne InnoDB. (Bogue #16368875, Bug #18776592, Bug #17665767)

mysql_config_editor a laissé certains fichiers ouverts lorsqu'ils n'étaient plus nécessaires, ce qui a entraîné des avertissements Valgrind. (Bogue #16368498)

Plusieurs problèmes liés au mode SQL ONLY_FULL_GROUP_BY ont été corrigés :

Avec ONLY_FULL_GROUP_BY activé, certaines requêtes valides étaient rejetées si la table accédée était remplacée par une vue.

Requêtes de la forme SELECT DISTINCT col1 . COMMANDÉ PAR col2 qualifié d'interdit par SQL2003 (colonnes ORDER BY cachées combinées à DISTINCT ), mais n'ont pas été rejetés avec le mode SQL ONLY_FULL_GROUP_BY activé.

(Bogue #16021396, Bogue #18993257, Bogue #13581713)

La modification apportée à MySQL 5.7.0 pour afficher la valeur XID en hexadécimal pour XA RECOVER si elle contenait des caractères non imprimables a été annulée car elle causait des problèmes pour certains clients. Désormais, l'instruction prend un mot clé CONVERT XID facultatif afin que les clients puissent demander la valeur XID en hexadécimal à la demande. (Bogue #14670465)

L'utilisation d'un algorithme non multi-octets pour ignorer les espaces de début dans les chaînes multi-octets peut entraîner la sortie du serveur. (Bogue #12368495, Bug #18315770)

L'exécution d'une instruction DELETE sur une table sans clé en mode de mise à jour sécurisée a entraîné une erreur ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE. Pour les versions de débogage, l'utilisation de IGNORE dans l'instruction a entraîné la levée d'une assertion. (Bogue #74493, Bug #19873291)

Les distributions MySQL binaires pour OS X 10.8 et versions ultérieures regroupent désormais les outils MySQL.prefPane et MySQLStartupItem.pkg dans le package principal en tant qu'options configurables au lieu de packages séparés. (Bogue #74123, Bug #19701502)

Pour les versions de débogage, un SELECT sous charge de la table events_statements_current Performance Schema peut déclencher une assertion. (Bogue #73530, Bug #19419463)

mysql_secure_installation ne s'est pas exécuté correctement si le plug-in d'authentification du compte root était sha256_password . (Bogue #73148, Bug #19127636)

Le serveur n'a pas pris en compte la valeur lower_case_table_names pour déterminer le répertoire de base de données à partir duquel lire le fichier db.opts, et pouvait donc lire le fichier à partir d'un répertoire incorrect. (Bogue #72900, Bug #18923685)

SHA2() n'a pas réussi à renvoyer NULL si l'argument de longueur de hachage était NULL ou n'était pas l'une des valeurs autorisées. (Bogue #72856, Bug #18899869)

mysql_install_db n'a pas réussi à créer le compte root initial si la validation automatique était désactivée. (Bogue #72724, Bug #18911807)

Le mysql le client a affiché les données gb18030 de manière incorrecte. (Bogue #72573, Bug #18726196)

Le classement gb18030_chinese_ci a traité 'Y' égal à '

Le cache de requêtes n'était pas invalidé pour une table lorsqu'une contrainte référentielle CASCADE DELETE ou CASCADE UPDATE était spécifiée et que le nom de la base de données ou le nom de la table contenait des caractères spéciaux. (Bogue #72547, Bug #18710853)

À PRÉSENT( N ) dans une définition de vue a été stocké en tant que NOW() , perdant ainsi la partie fraction de seconde. (Bogue #72472, Bug #18675237)

Si une instruction préparée en cours d'exécution produisait une erreur, le serveur ne parvenait pas à écrire l'instruction dans le journal des requêtes général. (Bogue #72375, Bug #18616826)

Un nouveau Cfaire L'option, SUNPRO_CXX_LIBRARY , active la liaison avec libCstd au lieu de stlport4 sur Solaris 10 ou version ultérieure. Cela ne fonctionne que pour le code client car le serveur dépend de C++98. Exemple d'utilisation :

Une instruction SELECT utilisant une sous-requête avec UNION et ORDER BY n'autorisait pas l'utilisation d'un alias dans l'instruction externe. (Bogue #72189, Bug #18498344)

Les requêtes UNION avec une fonction d'agrégat dans une clause ORDER BY n'ont pas été rejetées comme elles devraient l'être. Désormais, ces requêtes sont rejetées avec une erreur ER_AGGREGATE_ORDER_FOR_UNION. Exemple:

Une requête non agrégée avec un ORDER BY appliqué ne peut pas contenir de fonctions d'agrégat, mais n'a pas été rejetée comme il se doit. Désormais, ces requêtes sont rejetées avec une erreur ER_AGGREGATE_ORDER_NON_AGG_QUERY. Exemple:

(Bogue #72174, Bogue #18503515, Bogue #72512, Bogue #18694751)

Les opérations MOD sur une valeur DECIMAL avec des zéros non significatifs peuvent produire des résultats incorrects. (Bogue #72100, Bug #18509896)

mysqlslap accepté une valeur d'option --iterations de 0, ce qui a entraîné une erreur de division par zéro. La valeur minimale de l'option est désormais de 1. Merci à Tsubasa Tanaka pour le patch. (Bogue #72082, Bogue #18430704)

mysql_upgrade pourrait échouer si la table mysql.user contenait plusieurs comptes avec le même nom d'utilisateur et le même nom d'hôte où le nom d'hôte différait en casse. Ce n'est toujours pas autorisé, mais maintenant mysql_upgrade imprime un message d'erreur plus informatif pour indiquer la nature du problème :

ER_CANT_CREATE_GEOMETRY_OBJECT a été traité comme une erreur fatale, donc non interceptable avec les gestionnaires de conditions. (Bogue #72064, Bug #18413646)

Certaines comparaisons entre les valeurs signées et non signées BIGINT peuvent donner des résultats incorrects. (Bogue #72046, Bug #18408499)

Pour les prédicats IN() avec des valeurs différentes de la valeur des données clés, l'optimiseur utilisait parfois une analyse de table alors qu'il pouvait effectuer une analyse de plage. (Bogue #71962, Bug #18364815)

mysql_config_editor quitté lorsqu'un argument vide est donné à l'option --login-path. (Bogue #71837, Bug #18311024, Bug #18830493)

Les mises à niveau utilisant des packages RPM peuvent changer la propriété d'un répertoire d'installation. (Bogue #71715, Bug #18281535)

La table du schéma de performances des threads affichait une valeur PROCESS_ID de NULL pour les threads de réplication. Maintenant, il affiche le même ID que SHOW PROCESSLIST et la table INFORMATION_SCHEMA.PROCESSLIST. (Bogue #71682, Bug #18259356)

Dans la colonne DIGEST_TEXT des tables d'événements de l'instruction Performance Schema, les références aux variables système de la forme @@ nom_var ont été stockés comme @ @ nom_var . (Bogue #71634, Bug #18304086)

Pour mysqldump , les opérations de vidage et de restauration ont échoué pour les noms de base de données contenant une barre oblique inverse ( '' ). Merci à Xiaobin Lin pour le patch. (Bogue #71437, Bug #18109728)

Une OPTIMIZE TABLE et une ALTER TABLE en ligne simultanées sur la même table InnoDB pourraient entraîner un blocage. (Bogue n° 71433, Bogue n° 18110156)

XA START après un redémarrage du serveur avec le XID existant suivi de XA COMMIT n'a pas pu s'engager. (Bogue #71352, Bug #18068253)

Les utilisateurs proxy ne pouvaient pas exécuter d'instructions si le mot de passe utilisateur proxy avait expiré. (Bogue #71337, Bug #18057562)

MySQL n'a pas compilé avec Bison 3. (Bogue #71250, Bug #18017820, Bug #18978946)

Un blocage pourrait se produire si trois threads exécutaient simultanément INSTALL PLUGIN , SHOW VARIABLES et mysql_change_user() . (Bogue #71236, Bogue #18008907, Bogue #72870, Bogue #18903155)

Une instruction de la forme suivante a interrompu la réplication basée sur les lignes car elle a créé une table ayant un champ de type de données BIGINT avec une largeur d'affichage de 3000, ce qui est au-delà de la valeur maximale acceptable de 255 :

Lorsque MySQL s'exécute en tant que service sur Windows, NTService.Stop() initie des événements d'arrêt et de sortie pendant l'arrêt. Après une réorganisation du code dans MySQL 5.7.3, un appel à clean_up() a été manqué, entraînant le lancement d'une récupération après incident. (Bogue #71104, Bug #17980260)

S'il y avait un prédicat sur une colonne référencée par MIN() ou MAX() et que ce prédicat n'était pas présent dans toutes les disjonctions sur les parties clés plus tôt dans l'index composé, Loose Index Scan renvoyait un résultat incorrect. (Bogue #71097, Bug #17909656)

Un accès mémoire non valide peut se produire lors de l'utilisation d'instructions préparées si un mysql la connexion client a été perdue une fois la préparation de l'instruction terminée et au moins une instruction était à l'état initialisé mais pas encore préparée. (Bogue #70429, Bug #17512527)

La reconnexion automatique du client ne fonctionnait pas pour les clients liés à libmysqlclient , même avec MYSQL_OPT_RECONNECT activé.

De plus, si une table FEDERATED était accédée après l'expiration de wait_timeout, une erreur de connexion perdue au serveur MySQL se produisait sans tentative de rétablissement de la connexion. (Bogue #70026, Bogue #17309863, Bogue #14874, Bogue #11745408)

Les requêtes de texte intégral sur les tables MyISAM qui incluaient une clause LIMIT mais aucune clause WHERE pouvaient renvoyer trop peu de lignes. (Bogue #69908, Bug #17261347)

Les mises à jour pouvaient échouer à mettre à jour toutes les lignes applicables dans les cas où plusieurs valeurs de clé étaient identiques, à l'exception des espaces de fin. (Bogue #69684, Bug #17156940)

Sous Windows, REPAIR TABLE et OPTIMIZE TABLE ont échoué pour les tables MyISAM avec des fichiers .MYD de plus de 4 Go. (Bogue #69683, Bug #17235179)

Pour la journalisation des instructions préparées dans le journal des requêtes général, la ligne Execute a été enregistrée après l'exécution de l'instruction, pas avant. (Bogue #69453, Bug #16953758, Bug #20536590)

Les appels à UNCOMPRESS() produisaient des avertissements Valgrind lors de la vérification de l'en-tête zip des données compressées. (Bogue #69202, Bug #18693654)

mysql_tzinfo_to_sql a mal géré certaines valeurs de la liste d'abréviations (lues à partir du fichier d'informations de fuseau horaire) en raison de l'échec de la prise en compte du caractère nul ajouté à la fin du tableau de caractères. (Bogue #68861, Bogue #16664462)

Certaines instructions peuvent être écrites deux fois dans le journal des requêtes lentes. (Bogue #68626, Bug #16467055)

Les autorisations de fichiers et les fins de ligne de plusieurs fichiers de test et de configuration ont été rendues plus cohérentes pour éviter les avertissements des vérificateurs de packages. (Bogue #68521, Bug #16415173, Bug #16395459, Bug #68517, Bug #16415032, Bug #71112, Bug #17919313, Bug #71113, Bug #17919422)

Dans certains cas, un CREATE VIEW réussi peut ajouter des parenthèses non valides aux expressions dans la définition de la vue. (Bogue #67791, Bug #15948263)

Si le journal des requêtes générales ou le fichier journal des requêtes lentes était défini sur un fichier FIFO ou socket et que le lecteur de fichiers disparaissait, le serveur arrêtait d'exécuter les instructions. Maintenant, le serveur détecte ces fichiers, enregistre un message d'erreur et continue avec le journal approprié désactivé. (Bogue #67088, Bug #14757009)

Pour les versions sans débogage de plusieurs programmes clients, le message --help n'indiquait pas correctement que --debug , --debug-check et --debug-info s'appliquaient uniquement aux versions de débogage. (Bogue n° 66854, Bogue n° 16272328)

La notification d'événements pour le journal général n'était reçue par le plug-in de journal d'audit que si le journal de requête général était activé. Désormais, les notifications sont publiées, que le journal des requêtes général soit activé ou non. (Bogue #60782, Bug #12368204, Bug #20536590, Bug #75796, Bug #20479643)

Les requêtes qui utilisaient GROUP BY INSERT() pouvaient produire de fausses erreurs de clé en double. (Bogue #58081, Bug #11765149)

mysql_install_db peut échouer s'il n'est pas invoqué dans le répertoire de base d'installation de MySQL. (Bogue #54034, Bug #11761529)

Avec big_tables activé, les requêtes qui utilisaient COUNT(DISTINCT) sur une jointure simple avec une condition d'égalité constante sur une clé non dupliquée renvoyaient des résultats incorrects. (Bogue #52582, Bogue #11760197)

Références : Voir aussi : Bug #18853696.

LOAD DATA LOCAL pouvait utiliser tout le processeur si des erreurs d'importation se produisaient alors qu'il n'y avait pas de délimiteurs de ligne. (Bogue #51840, Bogue #11759519)

Pour un plugin non dynamique (intégré) existant, le message d'erreur pour une tentative de UNINSTALL PLUGIN était trompeur (le plugin n'existe pas). Maintenant, le message indique que les plugins intégrés ne peuvent pas être désinstallés. (Bogue #51771, Bug #11759453)

Les correspondances LIKE ont échoué pour les points de code de HALF WIDTH KATAKANA dans les jeux de caractères sjis et cp932. (Bogue #47641, Bug #11755818)

Le serveur n'a pas produit d'erreur pour les instructions INSERT qui n'ont fourni aucun nom de colonne mais ont fourni des valeurs de colonne. (Bogue #20943, Bogue #11745889, Bogue #18064775)

Références : Ce problème est une régression de : Bug #16820562.

Les ID de connexion sont des entiers non signés de 32 bits, commençant à 1. Lorsque le serveur attribue des ID de connexion et atteint le haut de la plage de 32 bits, il réinitialise la valeur pour recommencer à 1. Il était possible que le serveur attribue un ID de connexion à un nouveau thread alors que cet ID était encore utilisé par un thread existant, si l'ancien thread était particulièrement long. Dans de tels cas, la référence à l'ID devient ambiguë. Par exemple, il ne peut pas être déterminé de manière fiable pour KILL id_connexion quel thread tuer, ce qui pourrait conduire à un comportement indéfini. Ce comportement a été corrigé afin que les ID en cours d'utilisation ne soient pas réutilisés.


Gestion des erreurs à l'aide de TRY…CATCH

Voici à quoi ressemble la syntaxe. C'est assez simple à comprendre. Nous avons deux blocs de code :

Tout ce qui se trouve entre BEGIN TRY et END TRY est le code que nous voulons surveiller pour une erreur. Ainsi, si une erreur s'était produite dans cette instruction TRY, le contrôle aurait été immédiatement transféré à l'instruction CATCH, puis il aurait commencé à exécuter le code ligne par ligne.

Maintenant, à l'intérieur de l'instruction CATCH, nous pouvons essayer de corriger l'erreur, signaler l'erreur ou même enregistrer l'erreur, afin que nous sachions quand cela s'est produit, qui l'a fait en enregistrant le nom d'utilisateur, toutes les choses utiles. Nous avons même accès à certaines données spéciales uniquement disponibles dans l'instruction CATCH :

    – Renvoie le numéro interne de l'erreur – Renvoie les informations sur la source – Renvoie les informations sur tout, des erreurs d'information aux erreurs que l'utilisateur de DBA peut corriger, etc. – Renvoie le numéro de ligne à laquelle une erreur s'est produite – Renvoie le nom de la procédure stockée ou la fonction - Renvoie les informations les plus essentielles et c'est le texte du message de l'erreur

C'est tout ce dont vous avez besoin pour gérer les erreurs de SQL Server. Tout peut être fait avec une simple instruction TRY et CATCH et la seule partie où cela peut être délicat est lorsque nous traitons des transactions. Pourquoi? Parce que s'il y a une BEGIN TRANSACTION, elle doit toujours se terminer par une transaction COMMIT ou ROLLBACK. Le problème est qu'une erreur se produit après que nous ayons commencé, mais avant de nous engager ou de revenir en arrière. Dans ce cas particulier, il existe une fonction spéciale qui peut être utilisée dans l'instruction CATCH qui permet de vérifier si une transaction est dans un état pouvant être validé ou non, ce qui nous permet ensuite de prendre la décision de l'annuler ou de la valider.

Passons à SQL Server Management Studio (SSMS) et commençons par les bases de la gestion des erreurs SQL Server. L'exemple de base de données AdventureWorks 2014 est utilisé tout au long de l'article. Le script ci-dessous est aussi simple que possible :

Ceci est un exemple de son apparence et de son fonctionnement. La seule chose que nous faisons dans BEGIN TRY est de diviser 1 par 0, ce qui, bien sûr, provoquera une erreur. Ainsi, dès que ce bloc de code est touché, il va transférer le contrôle dans le bloc CATCH, puis il va sélectionner toutes les propriétés à l'aide des fonctions intégrées que nous avons mentionnées précédemment. Si nous exécutons le script ci-dessus, voici ce que nous obtenons :

Nous avons obtenu deux grilles de résultats à cause de deux instructions SELECT : la première est 1 divisé par 0, ce qui provoque l'erreur et la seconde est le contrôle transféré qui nous a effectivement donné des résultats. De gauche à droite, nous avons ErrorNumber, ErrorState, ErrorSeverity, il n'y a pas de procédure dans ce cas (NULL), ErrorLine et ErrorMessage.

Maintenant, faisons quelque chose d'un peu plus significatif.C'est une bonne idée de suivre ces erreurs. Les choses qui sont sujettes aux erreurs doivent être capturées de toute façon et, à tout le moins, enregistrées. Vous pouvez également mettre des déclencheurs sur ces tables enregistrées et même configurer un compte de messagerie et faire preuve d'un peu de créativité dans la manière d'informer les personnes lorsqu'une erreur se produit.

Si vous n'êtes pas familier avec la messagerie de base de données, consultez cet article pour plus d'informations sur le système de messagerie : Comment configurer la messagerie de base de données dans SQL Server

Le script ci-dessous crée une table appelée DB_Errors, qui peut être utilisé pour stocker des données de suivi :

Ici, nous avons une colonne d'identité simple, suivie du nom d'utilisateur, afin que nous sachions qui a généré l'erreur et le reste est simplement l'information exacte des fonctions intégrées que nous avons énumérées plus tôt.

Maintenant, modifions une procédure stockée personnalisée à partir de la base de données et insérons un gestionnaire d'erreurs :

La modification de cette procédure stockée encapsule simplement la gestion des erreurs dans ce cas autour de la seule instruction à l'intérieur de la procédure stockée. Si nous appelons cette procédure stockée et transmettons des données valides, voici ce qui se passe :

Une instruction Select rapide indique que l'enregistrement a été inséré avec succès :

Cependant, si nous appelons une fois de plus la procédure stockée ci-dessus, en passant les mêmes paramètres, la grille de résultats sera remplie différemment :

Cette fois, nous avons deux indicateurs dans la grille de résultats :

0 lignes affectées – cette ligne indiquait que rien n'était réellement entré dans la table Sales

1 ligne affectée – cette ligne indique que quelque chose est entré dans notre table de journalisation nouvellement créée

Donc, ce que nous pouvons faire ici, c'est regarder le tableau des erreurs et voir ce qui s'est passé. Une simple instruction Select fera l'affaire :

Ici, nous avons toutes les informations que nous avons définies précédemment pour être enregistrées, mais cette fois, nous avons également rempli le champ de procédure et bien sûr le message technique SQL Server “friendly” que nous avons une violation :

Violation de la contrainte PRIMARY KEY ‘PK_Sales_1′. Impossible d'insérer une clé en double dans l'objet’ Sales.Sales’. La valeur de la clé en double est (20).

Comment c'était un exemple très artificiel, mais le fait est que dans le monde réel, le dépassement d'une date invalide est très courant. Par exemple, transmettre un ID d'employé qui n'existe pas dans le cas où nous avons une clé étrangère configurée entre la table Sales et la table Employee, ce qui signifie que l'employé doit exister pour créer un nouvel enregistrement dans la table Sales. Ce cas d'utilisation entraînera une violation de contrainte de clé étrangère.

L'idée générale derrière cela est de ne pas faire échouer l'erreur. Nous voulons au moins signaler à un individu que quelque chose s'est mal passé, puis le consigner sous le capot. Dans le monde réel, s'il existait une application reposant sur une procédure stockée, les développeurs auraient probablement également codé la gestion des erreurs SQL Server quelque part, car ils auraient su quand une erreur s'était produite. C'est également là qu'il serait judicieux de signaler une erreur à l'utilisateur/à l'application. Cela peut être fait en ajoutant la fonction RAISERROR afin que nous puissions lancer notre propre version de l'erreur.

Par exemple, si nous savons que la saisie d'un identifiant d'employé qui n'existe pas est plus susceptible de se produire, nous pouvons effectuer une recherche. Cette recherche peut vérifier si l'ID de l'employé existe et si ce n'est pas le cas, renvoyer l'erreur exacte qui s'est produite. Ou dans le pire des cas, si nous avons eu une erreur inattendue dont nous n'avions aucune idée de ce que c'était, alors nous pouvons simplement renvoyer ce que c'était.


9.8 Cas d'utilisation de l'adaptateur de base de données Oracle

Ceci décrit les cas d'utilisation de l'adaptateur de base de données Oracle et de l'adaptateur de base de données Oracle - procédures stockées.

Cette section comprend les sujets suivants :

9.8.1 Cas d'utilisation de l'adaptateur de base de données Oracle

Pour obtenir des cas d'utilisation d'Oracle Database Adapter, accédez au site Oracle SOA Sample Code.

Le Tableau 9-20 présente les exemples d'adaptateur de base de données Oracle fournis avec Oracle BPEL PM et Mediator.

Tableau 9-20 Cas d'utilisation de l'adaptateur de base de données Oracle

Illustre l'opération de suppression sortante de l'adaptateur de base de données Oracle. Un enregistrement XML est transmis à l'opération et la ligne de la base de données avec la même clé primaire est supprimée.

Illustre l'utilisation d'un fichier de données d'entrée natif (CSV) défini dans un format personnalisé. Le fichier d'entrée est un bon de commande, que l'adaptateur de fichiers traite et publie sous forme de message XML au processus BPEL FIle2Table. Le message est transformé dans un autre format de bon de commande et acheminé vers une activité d'appel.

Illustre l'opération d'insertion sortante de l'adaptateur de base de données Oracle. Un enregistrement XML est transmis à l'opération et inséré dans la base de données en tant que données relationnelles. (Dans JDeveloper BPEL Designer, Fusion (Insérer ou Mettre à jour) est fourni.)

Illustre les étapes supplémentaires (basées sur le didacticiel d'insertion) nécessaires pour ajouter la gestion des erreurs à votre processus BPEL.

Illustre une solution de contournement pour l'utilisation des types PL/SQL RECORD. JPublisher est utilisé pour créer un type OBJECT correspondant dont les attributs correspondent aux champs de RECORD et des API de conversion qui convertissent RECORD en OBJECT et vice versa. JPublisher génère également une procédure (ou fonction) wrapper qui accepte l'OBJET et appelle la méthode sous-jacente à l'aide des API de conversion dans les deux sens. Les méthodes invoquées doivent être installées dans une base de données Oracle (pas Oracle Lite).

Illustre comment migrer des données d'un ensemble de tables à un autre. L'exemple utilise l'adaptateur de base de données Oracle pour lire les données d'un ensemble de tables, traiter les données et les écrire dans un autre ensemble de tables de base de données à l'aide de l'adaptateur.

Illustre l'opération de fusion sortante de l'adaptateur de base de données Oracle. Un enregistrement XML est transmis à l'opération et une ligne correspondante dans la base de données est insérée ou mise à jour.

Illustre une opération d'interrogation entrante pour interroger les instances XML de la table MOVIES. Lorsqu'une nouvelle ligne est insérée dans la table MOVIES, l'opération d'interrogation la fait passer à Oracle BPEL PM. Cette stratégie utilise une table de contrôle pour stocker la clé primaire de chaque ligne qui n'a pas encore été traitée. Avec une jointure naturelle entre la table de contrôle et la table source (par clé primaire), l'interrogation sur la table de contrôle est pratiquement identique à l'interrogation directe sur la table source.

Illustre une opération d'interrogation entrante pour interroger des instances XML à partir de la table MOVIES. Chaque fois qu'une nouvelle ligne est insérée dans la table MOVIES, l'opération d'interrogation la fait passer à Oracle BPEL PM. Cette stratégie utilise une table d'assistance pour mémoriser une valeur de séquence.

Illustre une opération d'interrogation entrante pour interroger des instances XML à partir de la table MOVIES. Chaque fois qu'une nouvelle ligne est insérée dans la table MOVIES, l'opération d'interrogation la fait passer à Oracle BPEL PM. Cette stratégie implique l'utilisation d'une table d'assistance pour mémoriser une valeur last_updated.

Illustre une opération d'interrogation entrante pour interroger des instances XML à partir de la table MOVIES. Chaque fois qu'une nouvelle ligne est insérée dans la table MOVIES, l'opération d'interrogation la fait passer à Oracle BPEL PM. Cette stratégie implique la mise à jour d'un champ spécial sur chaque ligne traitée et la mise à jour de la clause WHERE au moment de l'exécution pour filtrer les lignes traitées.

Illustre comment interroger une table en fonction d'un champ de date.

Illustre comment contourner le générateur de clause WHERE de JDeveloper BPEL Designer pour spécifier des chaînes SQL arbitrairement complexes pour les opérations SELECT.

Illustre l'opération queryByExample sortante de l'adaptateur de base de données Oracle. Une requête SELECT SQL est créée dynamiquement en fonction des champs définis dans un exemple d'enregistrement XML, et tous les enregistrements correspondants sont renvoyés.

Illustre comment utiliser un REF CURSOR avec un XSD fortement typé ou faiblement typé. Vous pouvez utiliser l'assistant de configuration de l'adaptateur pour créer un XSD fortement typé pour un ensemble de lignes renvoyé par une procédure stockée de base de données Oracle ou une variable REF CURSOR de fonction. Pour plus d'informations, reportez-vous à la Section 9.3.3, « Prise en charge des ensembles de lignes à l'aide d'un XSD fortement ou faiblement typé ».

Illustre une solution de contournement pour l'utilisation d'un REF CURSOR . La solution implique l'utilisation d'une procédure stockée Java pour convertir le java.sql.ResultSet correspondant en une collection (soit VARRAY ou NESTED TABLE ) d'OBJETS.

Illustre l'opération SelectAll sortante de l'adaptateur de base de données Oracle. Sans clause WHERE, toutes les lignes de la table MOVIES sont renvoyées au format XML.

Illustre l'opération SelectAllByTitle sortante de l'adaptateur de base de données Oracle. La ligne de la table FILMS avec le titre sélectionné est renvoyée en XML.

Illustre l'opération de mise à jour sortante de l'adaptateur de base de données Oracle. Un enregistrement XML est transmis à l'opération et la ligne de la base de données avec la même clé primaire est mise à jour. (Dans JDeveloper BPEL Designer, Fusion (Insérer ou Mettre à jour) est fourni.)

Voir le tableau 9-3 pour la structure de la table MOVIES, qui est utilisée pour de nombreux cas d'utilisation. Les fichiers readme.txt qui sont inclus avec la plupart des exemples fournissent des instructions.

9.8.2 Cas d'utilisation de l'adaptateur de base de données Oracle - Procédures stockées

Cette section comprend les cas d'utilisation suivants :

En plus des cas d'utilisation documentés dans cette section, reportez-vous aux exemples de cas d'utilisation de l'adaptateur de base de données Oracle disponibles en accédant au site Oracle SOA Sample Code.

Le Tableau 9-21 présente les exemples de procédure stockée de l'adaptateur de base de données Oracle fournis avec Oracle BPEL PM et Mediator.

Tableau 9-21 Cas d'utilisation de l'adaptateur de base de données Oracle - Procédures stockées

Illustre une solution de contournement pour l'utilisation des types PL/SQL RECORD. JPublisher est utilisé pour créer un type OBJECT correspondant dont les attributs correspondent aux champs de RECORD et des API de conversion qui convertissent RECORD en OBJECT et vice versa. JPublisher génère également une procédure (ou fonction) wrapper qui accepte l'OBJET et appelle la méthode sous-jacente à l'aide des API de conversion dans les deux sens. Les méthodes invoquées doivent être installées dans une base de données Oracle (pas Oracle Lite).

Illustre comment utiliser un REF CURSOR avec un XSD fortement typé ou faiblement typé. Vous pouvez utiliser l'assistant de configuration de l'adaptateur pour créer un XSD fortement typé pour un ensemble de lignes renvoyé par une procédure stockée de base de données Oracle ou une variable REF CURSOR de fonction. Pour plus d'informations, reportez-vous à la Section 9.3.3, « Prise en charge des ensembles de lignes à l'aide d'un XSD fortement ou faiblement typé ».

Illustre une solution de contournement pour l'utilisation d'un REF CURSOR . La solution implique l'utilisation d'une procédure stockée Java pour convertir le java.sql.ResultSet correspondant en une collection (soit VARRAY ou NESTED TABLE ) d'OBJETS.

Voir le tableau 9-3 pour la structure de la table MOVIES, qui est utilisée pour de nombreux cas d'utilisation. Les fichiers readme.txt qui sont inclus avec la plupart des exemples fournissent des instructions.

9.8.2.1 Création et configuration d'une procédure stockée dans JDeveloper BPEL Designer

Ce cas d'utilisation décrit comment intégrer une procédure stockée dans BPEL Process Manager avec JDeveloper BPEL Designer.