备份/还原:mysqldump/binlog/LVM快照的备份/AB复制



第一种冷备
1.停掉mysql服务器
2.拷贝数据
 cd /data
 tar cjvf /tmp/mysql_bak.tar.bz2 ./

第二种逻辑备份:
mysqldump    --在线备份,需要锁表,效率低。只能备份某个时刻数据状态.
# mysqldump -uroot -p147258369 DB > /tmp/DB.sql        --单库
# mysqldump -uroot -p147258369 DB t1 > /tmp/DB.t1.sql    --单表
# mysqldump -uroot -p147258369 --all-databases > /tmp/all.sql    --全库

恢复:
# mysql -uroot -p123 < /tmp/all.sql

第三种增量数据:
binlog    --记录着mysql服务器增删改的操作记录.
mysqlbinlog
--start-datetime=name    开始的时间
--stop-datetime=name    结束的时间
--start-position=#    开始的位置(POS)
--stop-position=#     结束的位置

mysql> flush logs;
# mysqlbinlog  --start-position=190 --stop-position=833 mysqld.000001|mysql -uroot -p147258369

# mysqlbinlog  --start-position=1554 --stop-datetime="2011-09-02 11:48:10"   mysqld.000001 | mysql -uroot -p147258369

-----------------------------
备份方案1:
完全备份(mysqldump)+增量备份(binlog)

1.备份
# mysqldump -uroot -p147258369 --flush-logs --master-data=2 --all-databases > /tmp/all2.sql
   --flush-logs    --备份时先截断日志,产生新的日志
   --master-data=2    --记录当前all2.sql,对应的binlog文件名叫什么.

查看完整备份文件中的字段
# vim /tmp/all2.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysqld.000002', MASTER_LOG_POS=106;

2.还原
# mysql -uroot -p147258369 < /tmp/all2.sql
# mysqlbinlog --start-position=106 --stop-datetime="2011-09-02 14:00:20" mysqld.000002 | mysql -uroot -p147258369

使用脚本备份:
# vim mysql_backup.sh
#!/bin/bash


name=`date +%Y%m%d-%T`

/usr/bin/mysqldump -uroot -p147258369 --flush-logs --master-data=2 --all-databases > /tmp/$name.sql

crontab -e    设置第天5天点钟做备份
00 05 * * * /bin/sh /var/ftp/notes/scripts/mysql_backup.sh &> /dev/null

----------------------------
方案2:
完全备份(LVM快照)+增量备份(binlog)
1、确认你当前的数据文件是否存放在LVM卷上
2、确认卷组有空闲空间
3、全库锁表并截断日志,然后新建快照
4、全库解锁
5、做完整的数据备份
6、删除快照



1、确认你当前的数据文件是否存放在LVM卷上

2、确认卷组有空闲空间

3、全库锁表并截断日志,然后新建快照
mysql> flush tables with read lock;
mysql> flush logs;
shell> mysql -uroot -p123 -N -e "show master status;" > /mnt/next_binlog.txt
shell> lvcreate -n data_snap -s /dev/vol0/lv_data -L 1G
shell> mount /dev/vol0/data_snap /mnt

4、全库解锁
mysql> unlock tables;

5、做完整的数据备份
shell> cd /mnt
shell> tar czf /var/tmp/mysql.tar.gz .


6、删除快照
shell> umount /mnt
shell> lvremove /dev/vol0/data_snap


-----------------------------------
从快照上还原数据:
# mysqladmin -uroot -p147258369 shutdown
# rm -rf /data2/*
# tar xvf mysql-snap.tar.gz -C /data2    --还原数据

# cd /opt/mysql-glibc/
# ./bin/mysqld_safe --defaults-file=/data2/my.cnf &


AB复制    --主从复制,可以实现在线备份.

主从服务器的作用:
1、“准“在线备份
2、负载分担


   master-->slave1--slave2
       \-6->slave3

   master(binlog)-->slave
   192.168.0.123      192.168.0.254
1、主从机器使用的mysql版本最好一致。
2、在主服务器上启用二进制日志,并且server-id的取值要大于从服务器。
3、在主服务器上新建一个用于同步数据的账号。
4、在主服务器上导出原始数据到从服务器上。
5、在从服务器上指定主服务器,指定账号、binlog、binlog的起始位置。

1、主从机器使用的mysql版本最好一致。
在这个实例中使用的都是mysql官方的RPM包

2、在主服务器上启用二进制日志,并且server-id的取值要大于从服务器。
# vim /etc/my.cnf
server-id=1
log-bin=/mysql/logs/mysqld
log-bin-index=/mysql/logs/test_idx


3、在主服务器上新建一个用于同步数据的账号。
mysql> grant replication slave,reload,super on *.* to s_user@'192.168.0.254' identified by '123';

4、在主服务器上导出原始数据到从服务器上。
master:
# mysqldump -uroot -puplooking --master-data=2 --all-databases > /opt/slave.sql
# scp /opt/slave.sql 192.168.0.254:/opt
# scp /etc/my.cnf 192.168.0.254:/etc/

slave:
# service mysql start
# mysql < /opt/slave.sql     --导入数据
# vim /etc/my.cnf
[mysql]
       port=3306
       socket=/tmp/mysql.sock
       default-character-set=utf8

[mysqld]
       user=mysql
       port=3306
       socket=/tmp/mysql.sock
       datadir=/var/lib/mysql/
       character-set-server=utf8
       sync-binlog=0
       log_slow_queries
       long-query-time=1
       innodb_buffer_pool_size = 1G
       innodb_max_dirty_pages_pct = 90
       innodb_flush_log_at_trx_commit = 1
       default-storage-engine=innodb
       server-id=100
# service mysql restart


5、在从服务器上指定主服务器,指定账号、binlog、binlog的起始位置。
mysql> CHANGE MASTER TO
   -> MASTER_HOST='192.168.0.123',
   -> MASTER_USER='s_user',
   -> MASTER_PASSWORD='123',
   -> MASTER_PORT=3306,
   -> MASTER_LOG_FILE='mysqld.000007',
   -> MASTER_LOG_POS='288',
   -> MASTER_CONNECT_RETRY=3;

mysql> start slave;
mysql> show slave status \G;
         Slave_IO_Running: Yes
         Slave_SQL_Running: Yes
         Master_Log_File: mysqld.000008
         Read_Master_Log_Pos: 610
         Exec_Master_Log_Pos: 610

-------------------------
常用的命令:
start slave
stop slave

STOP SLAVE IO_THREAD ;
STOP SLAVE SQL_THREAD;

---------------------
在从服务器上启用binlog:
vim /etc/my.cnf
logs-slave-updates
logs-bin