scp viene de (Secure Copy) que quiere decir que puedes realizar copias seguras y encriptadas usando ssh. La conexión será encriptada, haciendo de esta una forma muy segura de transferir o copiar archivos de un servidor a otro.
Puedes incluso copiar archivos de una PC remota a otra PC remota, sin que los archivos tengan que pasar por tu PC.
Es posible limitar el ancho de banda que scp utilizara para copiar archivos, esto es particularmente útil, cuando se copian grandes caridades de archivos, así no saturas el canal disponible.
scp -l limite usuario@servidor:/ruta/archivo .
donde el limite esta en Kbps.
Incrementar la velocidad de scp
scp usa AES-128 para encriptar los datos que envia, esto es bastante seguro, pero también algo lento, pues aumenta los bytes a ser enviados. Esto puede mejorarse, bajando un poco la seguridad.
scp -c arcfour user@server:/home/user/file .
Sera menos seguro, per más rápido.
Notas finales
Es interesante notar, que scp encripta la información antes de enviarla por la internet, por lo que si esta disponible, se debe usar sobre ftp or rcp.
scp viene de (Secure Copy) que quiere decir que puedes realizar copias seguras y encriptadas usando ssh. La conexión será encriptada, haciendo de esta una forma muy segura de transferir o copiar archivos de un servidor a otro.
Puedes incluso copiar archivos de una PC remota a otra PC remota, sin que los archivos tengan que pasar por tu PC.
Es posible limitar el ancho de banda que scp utilizara para copiar archivos, esto es particularmente útil, cuando se copian grandes caridades de archivos, así no saturas el canal disponible.
scp -l limite usuario@servidor:/ruta/archivo .
donde el limite esta en Kbps.
Incrementar la velocidad de scp
scp usa AES-128 para encriptar los datos que envia, esto es bastante seguro, pero también algo lento, pues aumenta los bytes a ser enviados. Esto puede mejorarse, bajando un poco la seguridad.
scp -c arcfour user@server:/home/user/file .
Sera menos seguro, per más rápido.
Notas finales
Es interesante notar, que scp encripta la información antes de enviarla por la internet, por lo que si esta disponible, se debe usar sobre ftp or rcp.
Esto es algo que siempre me pasa y nunca me acuerdo de cómo solucionarlo. Hoy he recibido una alerta de uno de mis servidores, MySQL se había parado y no podía reiniciarse. Al entrar a la máquina para hacerlo manualmente, en efecto, me decía que no podía, que los archivos eran de sólo lectura . Después de hacer alguna comprobación más me doy cuenta de que la unidad entera se había quedado en algún estado extraño de sólo lectura a pesar de que el mount indicaba lo contrario.
[osus@servidor ~]# mount
/dev/hdb1 on /mnt/unidad type ext3 (rw)
Decido entonces desmontar la unidad y volver a montarla, pero…
[osus@servidor ~]# umount /mnt/unidad
umount: /mnt/unidad: device is busy
Y aquí viene el problema. Había parado, en teoría, todos los servicios que utilizaban esa unidad, pero aún así me daba este error. Podría haber forzado el umount con:
umount -l /dev/hdX
Pero prefiero saber qué es lo que está ocupando la unidad antes de forzarlo, cuestión de precaución sólo. Necesitamos saber, entonces, qué procesos están haciendo uso de la unidad que queremos desmontar, y esto es lo importante de este artículo.
[osus@servidor ~]# fuser -vm /dev/hdb1
USER PID ACCESS COMMAND
/dev/hdb1: named 456 ..c.. named
mysql 587 F.c.. mysqld
apache 1113 F…. httpd
root 1925 ..c.. screen
root 1926 ..c.. bash
apache 8009 F…. httpd
apache 9267 F…. httpd
Con este sencillo comando de fuser ya sabemos quién accede a la unidad en cuestión. En mi caso era un proceso bash de un screen que estaba abierto y un rsync. Los paré y ya pude desmontar la unidad correctamente. Al volver a montarla todo comenzó a funcionar correctamente.
¿La causa? Ni idea, no había nada raro en los logs, pero me da que el rsync había hecho algo extraño…
Para montar un recurso compartido que este en un SO Windows lo primero que debemos hacer es instalar el cliente samba para que interprete el sistema de archivos ntfs
si no se tiene instalado saldra un error similar al siguiente
mount: //192.168.0.x/SHARE/ is not a valid block device
una vez instalado el cliente samba solo basta montar la unidad asi:
mount -t cifs //IP_REMOTA/SHARE/ /PUNTO_MONTAJE(normalmente un directorio dentro del directorio /mnt) -o username=USUARIO,password=PASSWORD,domain=DOMINIO o GRUPO_DE_TRABAJO
El comando cp en Linux, también conocido como copy, es un comando UNIX que como su propio nombre indica, se utiliza para copiar ficheros. Dado que es uno de los comandos más utilizados en Linux, hoy vamos a explicaros cómo se utiliza.
Al utilizar el comando cp en Linux, los ficheros pueden ser copiados al mismo directorio o por el contrario a un directorio diferente. Si el fichero va a ser copiado al mismo directorio donde existe el fichero original, el nuevo fichero debe tener un nombre diferente. Por el contrario, si el fichero va a ser copiado a otro directorio, el fichero puede tener cualquier nombre. Al ejecutar el comando cp en Linux, el fichero original no cambia.
Si queremos copiar un fichero a otro fichero del mismo directorio utilizando el comando cp en Linux:
cp [opciones] ficheroorigen ficherodestino Un ejemplo real de uso, podría ser el realizar un backup de un fichero:
cp log.txt log.bak Si por el contrario queremos copiar un fichero a un directorio utilizando el comando cp en Linux, la sintaxis será la siguiente:
cp [opciones] ficheroorigen directoriodestino Un ejemplo en el cual pasamos un archivo llamado “log.txt” al directorio /home/usuario/logs/ utilizando el comando cp en Linux, podría ser el siguiente:
cp log.txt /home/usuario/logs/ Si por el contrario queremos copiar varios ficheros (log1.txt, log2.txt y log3.txt) con el comando cp en Linux, habría que hacer lo siguiente:
cp log1.txt log2.txt log3.txt /home/usuario/logs/ En caso de que queramos pasar todos los ficheros que se encuentran dentro de un directorio a otro, haremos lo siguiente:
cp /home/usuario/logs/* /home/usuario/nueva-carpeta-logs En este último caso, no copiamos el directorio logs, sino todos los ficheros que están dentro del directorio logs. Si por el contrario queremos copiar un directorio entero, la sintaxis es la siguiente:
cp [opciones] –R directorioorigen directoriodestino Un ejemplo en el cual copiaríamos la carpeta “logs” (/home/usuario/logs/) en “/home/usuario/pruebas/”sería el siguiente:
cp /home/usuario/logs/ /home/usuario/pruebas/ Como se puede ver, el comando cp en Linux ofrece muchas posibilidades. Hasta ahora hemos visto los comandos más habituales sin introducir las [opciones] o “flags” que hemos explicado en la sintaxis. A continuación veremos los flags más utilizados con el comando cp en Linux:
Backup: -bCrea un backup en el destino en el caso en el que exista un archivo llamado igual que el que queremos generar.
Force: -fFuerza el borrado de los archivos destino sin consultar o avisar al usuario.
Interactive: -iInforma antes de sobrescribir un archivo en el destino indicado.
Link: -lRealiza un link en vez de copiar los ficheros.
Preserve: -pRealiza la copia de los ficheros y directorios conservando la fecha de modificación de los archivos y carpetas originales.
Copia recursiva: -rCopia de forma recursiva.
Suffix: -S SUFFIXAñade la palabra “SUFFIX” (o la palabra que le indiquemos, por ejemplo BACKUP) a los archivos de backup creados con el flag “–b”.
Update: -uEl comando cp en Linux no copia un archivo o directorio a un destino si este destino tiene la misma fecha de modificación o una fecha de modificación posterior comparándola con el archivo o directorio que queremos mover.
Verbose: -vMuestra lo que se está ejecutando.
Con esto finalizamos el manual del comando cp en Linux y algunos de los flags más utilizados con él. Esperamos que este manual sobre cómo funciona el comando cp en Linux os sirva de ayuda a la hora de administrar vuestro Sistema Operativo.
Copyright 2005-2012 Sergio González Durán Se concede permiso para copiar, distribuir y/o modificar este documento siempre y cuando se cite al autor y la fuente de linuxtotal.com.mx y según los términos de la GNU Free Documentation License, Versión 1.2 o cualquiera posterior publicada por la Free Software Foundation.
autor: sergio.gonzalez.duran@gmail.com
mysqldump es parte de los "MySQL Client Programs" programas de cliente de MySQL, que puede ser utilizado para generar respaldos de bases de datos y ser usados incluso para ser transferidos a otro servidor de base datos SQL (No estrictamente tiene que ser un servidor MySQL).
En este guía práctica de LinuxTotal aprenderás (por ejemplos) los usos y opciones más comunes de este potente comando de MySQL.
Uso básico
Tres formas básicas de invocar mysqldump son posibles:
1) respalda una sola base de datos, indicando su nombre, y opcionalmente una o más tablas de la misma base de datos. Si no se indican tablas, se respaldan todas.
2) respalda una o más bases de datos de forma completa, no se pueden indicar tablas individuales de esta manera.
3) respalda de forma completa todas las bases de datos del servidor MySQL de forma completa, no se pueden indicar tablas individuales de esta manera.
En todos los casos se indica que la salida del comando, es decir, el vaciado del respaldo se guarde en el archivo llamado "respaldo.sql", este archivo es el resultado final, lo que puede utilizarse después para restaurar una base de datos (véase ejemplos más adelante).
Opciones más comunes
mysqldump es un comando con decenas de opciones, para verlas todas utiliza la ayuda en línea que se proporciona a través de
mysqldump --help
Lo anterior muestra las posibles opciones específicas de la versión de MySQL que utilices asi que pueden variar con respecto a la siguiente lista:
mysqldump OPCIONES MÁS COMUNES
Opción
Corto
Descripción
Añade la sentencia 'DROP DATABASE' antes de cada sentencia 'CREATE DATABASE'
Añade la sentencia 'DROP TABLE' antes de cada sentencia 'CREATE TABLE'
Respalda todas las tablas de todas las bases de datos.
Añade comentarios en el archivo de respaldo. Esta opción está por defecto activada, para desactivar los comentarios utiliza .
Produce una salida más compatible con otros sistemas de bases de datos o versiones anteriores de MySQL.nombre puede tomar estos valores: ansi, mysql323, mysql40, postgresql, mssql, oracle, db2, maxdb.
Usa sentencias INSERT completas que incluyen nombres de columnas.
Incluye todas las opciones específicas de MySQL para la creación de tablas que se usan con la sentencia 'CREATE TABLE'.
Permite respaldar una o más bases de datos. Después de la opción se indica(n) el(los) nombre(s) de la(s) base de datos a respaldar. Se respalda cada base de datos completa. En la salida se incluye con esta opción las sentencias 'CREATE DATABASE' y 'USE' antes de cada nueva base de datos.
Usa la sentencia 'INSERT' con el formato de múltiples registros con varias listas de 'VALUES'. Esto produce una salida más reducida y acelera el proceso de INSERTS cuando el archivo es restaurado. Ideal para bases de datos con tablas que contienen miles de registros.
Si se tienen views o vistas en la base de datos a respaldar y la vista hace referencia a una tabla que ya no existe, el vaciado del respaldo terminará con un error sin completarse. Con esta opción se podrá continuar.
Se realiza el respaldo de el servidor MySQL indicado por nombre, puede ser una dirección IP o un nombre de servidor válido. Si no se especifica el default eslocalhost.
Si no se desea respaldar una tabla en específico se utiliza esta opción, es obligario indicar la base de datos un punto y después nombre de la tabla. Si son varias tablas las que se han de ignorar se usa esta opción múltiples veces. También puede usarse para ignorar vistas.
Si el respaldo viene de un servidor MySQL que actua como maestro en una esquema de replicación, el uso de esta opción es muy importante ya que incluira sentencias del tipo "CHANGE MASTER TO" que indican la posición en los archivos de bitácora binarios necesarios para que los servidores esclavos se sincronicen adecuadamente.
Esta opción suprime las sentencias "CREATE DATABASE" que por defecto se incluyen en el respaldo.
No escribe o respalda registro alguno solo el esquema de la base de datos.
Esta opción esta por defecto activada, produce un vaciado rápido y totalmente compatible con otros servidores MySQL. Es un alias que activa las opciones, , , entre otras.
La contraseña para conectarse al servidor indicado en la opción . Si usas la opción corta no debe haber un espacio. Es posible no indicar la contraseña y después de presionar la tecla intro se preguntará por esta.
Si servidor indicado en la opción utiliza un puerto diferente al default del servicio mysql (3306) debe de indicarse con esta opción.
Va de la mano con la opción ya que aplica principalmente para tablas grandes y del tipo transaccional. Permite agilizar la escritura al archivo de respaldo al leer registro por registro sin mandarlo a un buffer previo.
Opción por defecto activada. Pone entre comilla grave "`" a los nombres de los objetos como base de datos, tablas, columnas. Es recomendable dejarla siempre para evitar problemas de compatibilidad, pero si se desea desactivar utiliza la opción
Incluye en el respaldo rutinas almacenadas (procedimientos y funciones). Con esta función se incluyen las sentencias "CREATE PROCEDURE" Y "CREATE FUNCTION" que permiten re-crear completamente procedimientos almacenados y funciones. Esta opción NO esta por defecto enmysqldump asi que es motivo de sorpresa para DBA's nuevos enterarse que el respaldo en el que tanto confiaban no está completo al momento de necesitarlo, sino utilizaron esta opción.
Opción útil solo con tablas transaccionales como las del tipo InnoDB, ya que garantiza la integridad y la consistencia sin bloquear las tablas. Esto lo logra al emitir una sentencia "START TRANSACTION" antes de vaciar los datos al respaldo.
Desactiva la opción por defecto , con lo que se tienen que indicar individualmente las opciones a las que hace referencia.
Incluye triggers creados en el respaldo. Esta opción es automática, esta por defecto, sino se quiere utilizar el respaldo de triggers utiliza
El nombre de usuario de MySQL para conectarse al servidor indicado en la opción .
Modo verboso. Imprime información de lo que está haciendo el respaldo, usa doble para modo aun más verboso.
En vez de un respaldo por defecto formateado con sentencias SQL, esta opción ofrece una salida en un formato XML bien formado.
Ejemplos de uso de mysqldump
Respaldo de una sola base de datos completa
mysqldump clientes > clientes.sql
Respaldo de una sola base de datos con dos tablas
mysqldump clientes saldos facturas > clientes.sql
Respaldo completo de base de datos clientes y ventas
Respaldo de las bases de datos clientes y pedidos, con todas las opciones específicas para re-crear las tablas, además añadimos 'drop database' para asegurarnos que en la restauración se creé desde cero el respaldo, además ignoramos errores..
Respaldo completo de un servidor MySQL maestro en replicación, indicando en el respaldo la posición para sincronización con servidores esclavos, además añadimos insertar completos que incluyen los nombres de columnas en sentencias INSERT
Para descomprimir lo anterior y dejar el archivo listo para la restauración en si utiliza gunzip
gunzip respaldo_2011.sql.gz
Restaurando el respaldo
Hay varias maneras de lograr la restauración del respaldo. Con el comando mysql:
mysql -u root -p < respaldo.sql
Si se utilizó gzip para comprimir el respaldo, se puede descomprimir y restaurar en una sola línea:
gunzip < respaldo.sql.gz | mysql -u root -p
Si el respaldo contiene una sola base de datos y no contiene sentencias 'drop database' y 'create database', se puede entonces indicar la base de datos donde se debe realizar la restauración:
mysql -u root -p clientes < respaldo_clientes.sql
Lo anterior (cuando ya existe la base de datos) también se puede lograr con el comandomysqlimport
Es posible también utilizar la opción "-e" (execute) de mysql, que permite ejecutar un archivo con sentencias SQL, y un respaldo es exactamente eso, un largo script con sentencias SQL para recrear esquema y datos:
mysql -u root -p -e "source /ruta/a/respaldo.sql"
Un simple script para respaldos automáticos por medio de cron
El siguiente es un ejemplo de un script muy simple para respaldar todas las bases de datos con las opciones más comppletas de manera autómatica, además se comprime. El archivo que se genera contiene la fecha y la hora al momento del respaldo, por medio de cron se programa su ejecución a las 11:00 de la noche todos los días.
Solo si la ejecución del comando fue correcta y termina, anexa un pequeño mensaje al final de un archivo de bítacora, asi podemos consultarlo y observar que todos los días terminó correctamente
Guardar el respaldo como respaldoMySQL.sh y cambia sus permisos de ejecución que permita ejecución chmod 700 respaldoMySQL.sh (ver artículos relacionados más abajo para enlace de este comando)
#!/bin/bash
###################################################################################
# Copyright 2005-2012 Sergio González Durán (sergio.gonzalez.duran@gmail.com)
# Se concede permiso para copiar, distribuir y/o modificar este programa siempre
# y cuando se cite al autor y la fuente de linuxtotal.com.mx y según los términos
# de la GNU General Public License, Versión 3 o cualquiera
# posterior publicada por la Free Software Foundation.
####################################################################################
# fecha y hora, ejemplo 20110920_2300
# archivo termina como 'mysql_20110920_2300.sql.gz'
fecha=`date +%Y%m%d_%H%M`
archivo="mysql_$fecha.sql.gz"
# elimina la opción --master-data si tu servidor no es maestro en replicación
mysqldump --user=root --password=xyz --all-databases --opt --routines \
--add-drop-database --add-drop-table --complete-insert --create-options \
--master-data | gzip > /ruta/a/respaldos/$archivo && \
echo "Respaldo realizado exitosamente el `date`" >> /ruta/a/bitacora.txt
#adicionalmente si se tiene otro servidor linux, copiamos el archivo ya
#generado de respaldo por medio de scp de ssh y asi aseguramos que el
#respaldo este en otra locación, logrando redundancia (en los artículos
#relacionados chécate "Autentifiación SSH con llave privada")
# El usuario que ejecuta el comando es 'userdba' que existe en ambos servidores
su -c "scp -pq /ruta/a/respaldos/$archivo 192.168.1.100:/ruta/a/respaldosmysql/." userdba \
&& echo "Copia a servidor remoto se completo con exito el `date`" >> /ruta/a/bitacora.txt
La línea cron correspondiente para su ejecución programada quedaría de la siguiente manera en /etc/crontab
0 23 * * * root /ruta/a/respaldoMySQL.sh
Artículos relacionados para comprender el uso del script