备份函数和触发器
mysqldump --master-data=2 --single-transaction -R --triggers -A > all.sql
其中--master-data=2代表备份时刻记录master的Binlog位置和Position,--single-transaction意思是获取一致性快照,
-R意思是备份存储过程和函数,--triggres的意思是备份触发器,-A代表备份所有的库
查看主库备份时的binlog名称和位置,MASTER_LOG_FILE和MASTER_LOG_POS:
head -n 30 all.sql | grep 'CHANGE MASTER TO'
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=112;
mysql < /data/all.sql
============================================
备份分为冷备和热备
冷备份
因为mysql中库即目录(database is folder)所以冷备份其实就是备份整个目录。
停掉mysql服务,直接将当前目录(/var/lib/mysql)下的东西都拷贝到其他地方就行,恢复的时候直接拷回来就行了,并且将所
有者和组都改为musql。备份还原都需要需要停止服务
myisam engine 的将目录直接拷贝(三个文件 xt701.frm记录表结构 xt701.myd 存放数据 xt701.myi 存放索引)
innodb engine的需要将innodb及相关日志文件考走,不考日志恢复的时候起不来服务
热备份
mysql自带mysqldump command
备份mysqldump -u root -p xxxx xt701 > xt701.bak.sql 这里的xt701是库名
还原
先去数据库建立同名库 xt701
mysql -u root -p xxx < xt701.bak.sql
第三方软件
mydumper soft
mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
全备
[root@convirt tmp]# mysqldump -A -x > quanbei.sql
备份某个库
[root@convirt tmp]# mysqldump vfast > vvv.sql
[root@convirt tmp]# mysqldump --databases vfast > /opt/5.sql
备份单表 vfast库的T6表
mysqldump -x vfast T6 > /opt/t6.sql
vfast库名
恢复单个库
1)先去建库
2)导入备份文件
mysql> create database vfast;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
[root@convirt tmp]# mysql vfast < vvv.sql
#同时备份多个库 vfast and test
[root@instructor ~]# mysqldump --database vfast test > /opt/backup/vfast_no2.sql
增量备份单表
[root@convirt tmp]# mysqldump --lock-tables --flush-logs --master-data=1 vfast test > /opt/1.sql
or
[root@convirt tmp]# mysqldump --lock-tables --flush-logs --master-data=2 vfast test > /opt/3.sql
mysql> flush logs; 结束当前binlog开启新binlog
导出单个数据表结构和数据
mysqldump -h localhost -uroot -p123456 database table > dump.sql
mysqldump test H1 > 1.sql 到处test库H1表数据
备份表结构
[root@convirt tmp]# mysqldump --no-data --databases vfast > bb.sql
恢复
[root@convirt tmp]# mysql -u root -p [database name] < [backup file name]
基于日志备份
vim /etc/my.cnf
log-bin=binlog 启用二进制日志
log-bin-index=binlog.index 建立二进制日志索引
sync-binlog=1 (1代表立刻写到磁盘,0代表先在内存后写到磁盘)
expire_logs_days=10 binlog 日志文件10天过期
max_binlog_size=2G 指定binlog大小
binlog_do_db = 库名 指定只记录那个库的binlog
如何删除binlog
mysql> show master logs; 显示本机binlog
mysql> purge binary logs to 'binlog.000004'; 删除前3个
二进制日志 备份与恢复
参考日志http://www.jb51.net/article/45023.htm
定义条件截断binlog日志
例如恢复到binlog.000003
mysqlbinlog /var/lib/mysql/binlog.000003 |mysql
将binlog 日志导出成sql语句
mysqlbinlog /var/lib/mysql/binlog.000007 > 7.sql
同时导入多个binlog二进制日志
mysqlbinlog /var/lib/mysql/binlog.[0-10]* > 7.sql
--start-datatime 和--stop-datatime 选项可以用来指定从二进制日志的某个时间点来进行恢复。
-–start-position=# 指定开始和结束position
-–stop-position=#
[root@convirt mysql]# /usr/local/mysql/bin/mysqlbinlog --start-position=370 --stop-position=440
/var/lib/mysql/mysql-bin.000002
--start-position=370 --stop-position=440 这里面数字从哪儿来的呢?
[root@convirt mysql]# mysqlbinlog /usr/local/mysql/bin/mysqlbinlog
# at 370
#100929 21:35:25 server id 1 end_log_pos 440 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1285767325/*!*/;
从某个时间点开始还原【不需要提前删表】
mysqlbinlog binlog.[0-10]* --start-datetime="2014-03-02 10:30:00" |mysql
导入到某个时间点之前 【先删表,后还原】
mysqlbinlog /var/lib/mysql/binlog.[0-7]* --stop-datetime="2014-02-26 11:38:58" |mysql