2008-09-17 7 views
3

J'ai un système RHEL 5 avec un nouveau disque dur que je viens de dédier au serveur MySQL. Pour commencer, j'ai utilisé "mysqldump --host otherhost -A | mysql", même si j'ai remarqué que la page de manuel ne recommande jamais explicitement d'essayer ceci (mysqldump dans un fichier est un no-go.) Nous parlons de 500G de base de données.mysqldump | mysql renvoie une erreur 'trop de fichiers ouverts'. Pourquoi?

Ce processus échoue à des intervalles aléatoires, se plaignant que trop de fichiers sont ouverts (à quel point mysqld reçoit le signal pertinent, et meurt et respawns).

J'ai essayé de l'augmenter à sysctl et ulimit, mais le problème persiste. Qu'est-ce que je fais à ce sujet? Par défaut, mysqldump exécute un verrou par table de toutes les tables concernées.

Répondre

6

Si vous avez plusieurs tables qui peuvent dépasser la quantité de descripteurs de fichiers du processus serveur mysql. Essayez --skip-lock-tables ou si le verrouillage est impératif --lock-all-tables.
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

--lock-all-tables, -x

Lock all tables across all databases. This is achieved by acquiring a global read lock for the duration of the whole dump. This option automatically turns off --single-transaction and --lock-tables.

3

mysqldump a été signalé à Yeld cette erreur pour les bases de données plus grandes (1, 2, 3). Explication et solution de contournement de MySQL Bugs:

[3 février 2007 22h00] Sergei Golubchik Ce n'est pas vraiment un bug. Par défaut, mysqldump a activé --lock-tables, ce qui signifie qu'il essaie de verrouiller toutes les tables à avant de lancer le vidage. Et faire LOCK TABLES t1, t2, ... pour vraiment grand nombre de tables épuisera inévitablement tous les descripteurs de fichiers disponibles, comme LOCK a besoin de toutes les tables à ouvrir.

Contournement: - Les tables à verrou verrouillé désactiveront complètement ce verrouillage. Sinon, --lock-all-tables fera mysqldump pour utiliser FLUSH TABLES WITH READ LOCK qui verrouille toutes les tables dans toutes les bases de données (sans les ouvrir). Dans ce cas, mysqldump désactivera automatiquement --lock-tables car cela n'a aucun sens quand --lock-all-tables est utilisé.

Modifier: S'il vous plaît vérifier la solution de Dave pour InnoDB dans le commentaire ci-dessous.

+0

Ou si vous utilisez des tables innodb, essayez -single-transaction, ce qui évite à la fois le problème de l'exécution des handles de fichiers et le verrouillage de toutes vos tables –

0

Si votre base de données est trop volumineuse, vous avez quelques problèmes.

  1. Vous devez verrouiller les tables pour vider les données. Mysqldump prendra beaucoup de temps et vos tables devront être verrouillées pendant cette période. L'importation des données sur le nouveau serveur prendra également beaucoup de temps.

Depuis votre base de données va être essentiellement inutilisable pendant # 1 et # 2 ont lieu, je recommande vraiment arrêter la base de données et en utilisant rsync pour copier les fichiers sur l'autre serveur. C'est plus rapide que l'utilisation de mysqldump et beaucoup plus rapide que l'importation parce que vous n'avez pas l'IO et le CPU de génération d'index ajoutés.

Dans les environnements de production sous Linux, de nombreuses personnes placent des données Mysql sur une partition LVM. Ensuite, ils arrêtent la base de données, font un cliché LVM, démarrent la base de données et copient l'état de la base de données arrêtée à loisir.

Questions connexes