Comment enregistrer la sortie verbeuse de mysqldump?

11

Vous enregistrez généralement la sortie détaillée d'une commande Linux comme ceci:

# command > output.txt

Mais lorsque vous utilisez une commande comme mysqldump, l' >option renvoie le vidage des tables de base de données dans le fichier souhaité:

# mysqldump --username=whatever --password=whatever -h localhost database > dump.sql

Si vous ajoutez l' -voption (verbose) à mysqldump, elle génère des informations d'aide sur ce que fait la commande. Comment enregistrer cette sortie détaillée dans un fichier puisque l' >option est utilisée pour sortir les informations de la table de base de données dans un fichier?

Plus précisément, je vide la sortie d'une base de données dans une autre base de données comme ceci:

mysqldump -alv -h 123.123.123.123 --user=username --password=p@ssw0rd --add-drop-table databasename | mysql --user=username --password=p@ssw0rd -h localhost localdatabase

J'ai essayé ce qui suit mais le fichier de sortie était finalement vide

mysqldump -alv -h 123.123.123.123 --user = nom d'utilisateur --password = p @ ssw0rd --add-drop-table databasename | mysql --user = username --password = p @ ssw0rd -h localhost localdatabase> output.log

A également essayé ce qui suit, mais il a redirigé les informations de la base de données vers le fichier output.log au lieu de la base de données cible:

mysqldump -alv -h 123.123.123.123 --user=username --password=p@ssw0rd --add-drop-table databasename > output.log | mysql --user=username --password=p@ssw0rd -h localhost localdatabase

Et je ne vois aucune --log-file=FILEoption pour les mysqldumpdeux.

Jake Wilson
la source

Réponses:

9

Votre 1er mysqldump crée des structures de table et des INSERT et les place dans dump.sql.

Votre 2ème vidage est un vidage distant qui est directement canalisé dans mysql dans localhost.

Si vous essayez d'attraper une sortie basée sur des erreurs, essayez ceci:

mysqldump -alv -h 123.123.123.123 --user=username --password=p@ssw0rd --add-drop-table databasename 2> output.log | mysql --user=username --password=p@ssw0rd -h localhost localdatabase

L'utilisation 2>interceptera toute sortie basée sur une erreur (alias stderr). Le mysqldump devrait toujours diriger la sortie normale de la console (aka stdout) vers l'autre session mysql et charger les données comme prévu.

EXEMPLE: J'ai une petite base de données appelée sample sur mon PC.

J'ai couru ceci:

C:\LWDBA>mysqldump -u... -p... --verbose sample 2>sample.txt > sample.sql

C:\LWDBA>type sample.txt
-- Connecting to localhost...
-- Retrieving table structure for table users...
-- Sending SELECT query...
-- Retrieving rows...
-- Disconnecting from localhost...

C:\LWDBA>type sample.sql
-- MySQL dump 10.13  Distrib 5.5.12, for Win64 (x86)
--
-- Host: localhost    Database: sample
-- ------------------------------------------------------
-- Server version       5.5.12-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `users`
--

DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `users_tbl_points` int(11) NOT NULL,
  `users_tbl_rank` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `users_tbl_points` (`users_tbl_points`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `users`
--

LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` VALUES (1,785523,9),(2,443080,20),(3,858830,7),(4,964909,3),(5,248056,24),
(6,345553,21),(7,983596,2),(8,881325,6),(9,455836,19),(10,635204,16),(11,808514,8),
(12,136960,28),(13,259255,22),(14,885399,5),(15,649229,15),(16,589948,18),(17,2055,30),
(18,240429,25),(19,195981,26),(20,258620,23),(21,705158,12),(22,749931,11),(23,634182,17),
(24,921117,4),(25,703038,13),(26,751842,10),(27,650093,14),(28,994943,1),(29,24437,29),
(30,137355,27);
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2012-03-02 15:49:54

C:\LWDBA>

Essaie !!!

RolandoMySQLDBA
la source
Merci qui a très bien fonctionné. Utiliser 2>au lieu de >était la clé. Qu'est-ce que cela signifie exactement? Je pensais 2>que tu ne sortais pas stderrsous Linux ...
Jake Wilson
2> est stderr. Je suppose que MySQL (eh Oracle [déteste dire que]) signifiait --verbose pour aller à stderr pour éviter la confusion de la sortie mysqldump avec la sortie d'état.
RolandoMySQLDBA
3

mysqldump -v sort vers le flux stderr donc il vous suffit de rediriger cela

mysqldump -alv -h 123.123.123.123 --user=username --password=p@ssw0rd --add-drop-table databasename 2> dump.log | mysql --user=username --password=p@ssw0rd -h localhost localdatabase

exemple

 foo@bar: ~ > mysqldump -v -u root mysql > /dev/null 2> output.log
 foo@bar: ~ > cat output.log 
 -- Connecting to localhost...
 -- Retrieving table structure for table columns_priv...
 -- Sending SELECT query...
 -- Retrieving rows...
 -- Retrieving table structure for table db...
RS
la source