天天看點

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