Transférer des millions de fichiers d'un serveur à un autre

15

J'ai deux serveurs. L'un d'eux possède 15 millions de fichiers texte (environ 40 Go). J'essaie de les transférer sur un autre serveur. J'ai envisagé de les compresser et de transférer les archives, mais j'ai réalisé que ce n'était pas une bonne idée.

J'ai donc utilisé la commande suivante:

scp -r usrname@ip-address:/var/www/html/txt /var/www/html/txt

Mais j'ai remarqué que cette commande transfère seulement environ 50 000 fichiers, puis la connexion est perdue.

Existe-t-il une meilleure solution qui me permette de transférer toute la collection de fichiers? Je veux utiliser quelque chose comme rsyncpour transférer les fichiers qui n'ont pas été transférés lorsque la connexion a été perdue. Lorsqu'une autre interruption de connexion se produirait, je retaperais la commande pour transférer des fichiers, en ignorant ceux qui ont déjà été transférés avec succès.

Ce n'est pas possible avec scp, car il commence toujours par le premier fichier.

yuli chika
la source

Réponses:

33

Comme vous le dites, utilisez rsync:

rsync -azP /var/www/html/txt/ username@ip-address:/var/www/html/txt

Les options sont les suivantes:

-a : enables archive mode, which preserves symbolic links and works recursively
-z : compress the data transfer to minimise network usage
-P : to display a progress bar and enables you to resume partial transfers

Comme @aim le dit dans sa réponse, assurez-vous que vous avez une fin /sur le répertoire source (sur les deux, c'est bien aussi).

Plus d'informations sur la page de manuel

garethTheRed
la source
1
Je suggère d'ajouter le -hdrapeau pour utiliser des unités lisibles par l'homme. Et si vous voulez plus de verbosité, vous avez quelques options: -iet / ou -v/ -vv.
nyuszika7h
2
Il y a généralement très peu de raisons de ne pas toujours utiliser rsync au lieu de scp. Son utilisation de base est la même et il offre de nombreuses fonctionnalités supplémentaires.
pimlottc
si ce sshn'est pas une option pour vous et que vous n'avez pas besoin ou ne voulez pas le cryptage, vous pouvez essayer mon script s3.amazonaws.com/skaperen/rsend
Skaperen
7

Utilisez simplement rsync sur ssh!

rsync -av username@ip:/var/www/html/txt /var/www/html/

Depuis la page de manuel:

-a , - archive : C'est équivalent à -rlptgoD. C'est un moyen rapide de dire que vous voulez une récursivité et que vous souhaitez conserver presque tout (avec -H étant une omission notable). La seule exception à l'équivalence ci-dessus est lorsque --files-from est spécifié, auquel cas -r n'est pas implicite.

-v , - verbose : cette option augmente la quantité d'informations qui vous sont fournies pendant le transfert. Par défaut, rsync fonctionne en silence. Un seul -v vous donnera des informations sur les fichiers qui sont transférés et un bref résumé à la fin. Deux options -v vous donneront des informations sur les fichiers ignorés et un peu plus d'informations à la fin. Plus de deux options -v ne doivent être utilisées que si vous déboguez rsync.

Notez comment j'ai utilisé des barres obliques à la fin des dossiers - c'est important .

objectif
la source
Vous devriez probablement ajouter plus d'informations sur l'importance de la barre oblique finale. À partir de la rsyncpage de manuel: "Une barre oblique de fin sur la source modifie ce comportement pour éviter de créer un niveau de répertoire supplémentaire à la destination. Vous pouvez penser à une fin / sur une source comme signifiant" copier le contenu de ce répertoire "par opposition à" copier le répertoire par son nom ", mais dans les deux cas, les attributs du répertoire contenant sont transférés vers le répertoire contenant sur la destination."
nyuszika7h
... et la signification des drapeaux -av?
MrWhite
0

Utilisez lftp, son beaucoup plus rapide que rsync et son meilleur pour la mise en miroir de sites Web (de nombreux petits fichiers). Il peut également transférer en parallèle en utilisant plusieurs connexions:

lftp -u username,password sftp://ip-address -e 'mirror --only-newer --no-dereference --parallel=5 /remote/path/ /destination/;quit'

Si une connexion est interrompue, elle se reconnectera et continuera. Si vous interrompez le transfert, il ignorera les fichiers existants et continuera.

http://lftp.yar.ru/

Mihajlo
la source
0

Une autre façon est de canaliser un fichier tar (éventuellement compressé) sur ssh:

tar -czf - ./* | ssh other.host.foo "cd /tmp; tar -xzf-"
jmullee
la source