天天看点

mysql 备份与恢复

--mysql备份整个数据库

mysqldump -uroot -p -hcentos7 -P3306 --all-database >all.sql

mysqldump --socket=/var/lib/mysql/mysql.sock -uroot -p --all-database >/tmp/mysql_database_backup.sql

mysqldump -uredmine -predmine1234  redmine >/tmp/mysql_database_backup.sql

mysql -uredmine -predmine1234 --socket=/var/lib/mysql/mysql.sock

--导出指定的库

mysqldump -uroot -p -hcentos7 -P3306 --database test --fields-terminated-by ',' >test.sql

--导入整个数据库

mysql -uroot -p test<mysql_database_backup.sql

--恢复到指定的时间段内的数据

mysqlbinlog --stop-date="2015-03-21 17:21:58" /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456

mysqlbinlog --start-date="2015-03-21 17:21:03" --stop-date="2015-03-21 17:22:58" /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456

--备份表结构,mysqldump默认不导出INFORMATION_SCHEMA or performance_schema数据库,如果要导出它们需要加上--skip-lock-tables

mysqldump --no-data --databases performance_schema --skip-lock-tables -uroot -p123456 >/tmp/table_ddl.sql

--single-transaction如果是innodb不加锁啊!相当于对表SELECT,其他会话不能更改表结构,目前只对事务性的存储引擎有作用,即INNODB存储引擎

1.--lock-tables

执行命令

mysqldump -uroot --lock-tables --databases db1 db2 > test.sql

它在导出db1的时候,会对db1所有的表上锁,导出结束之后释放锁.然后再同样导出db2.

也就是说在db1导出的时候,db2的数据可能还在变化.

其一般用于MYISAM存储引擎,备份时只能对数据库表进行读取操作,不允许DML

2.--lock-all-tables

mysqldump -uroot --lock-all-tables --databases db1 db2 > test.sql

它会在一开始就对所有的数据库的所有表上锁,请注意它会使用FLUSH TABLES

3.--single-transaction

mysqldump -uroot --single-transaction --databases db1 db2 > test.sql

可以看到它设置整个导出的过程为一个事务.避免了锁,在备份开始前,先执行start transaction

4.--master-data

它对所有数据库的所有表上了锁,并且查询binlog的位置。请注意它会使用FLUSH TABLES

5.--master-data + --single-transaction

mysqldump -uroot --master-data --single-transaction --databases db1 db2 > test.sql

这种组合,会先对所有数据库的所有表上锁,读取binlog的信息之后就立即释放锁,这个过程是十分短暂的。

然后整个导出过程都在一个事务里.

请注意它会使用FLUSH TABLES