mysql 手里有粮,心里不慌

 
可以通过两种方式做mysql备份
1:通过操作系统命令进行系统层次的备份
2:通过mysqldump 这个程序备份

利用tar 备份
service mysql stop
cd /var/lib/mysql
tar cf mysql.db.tar mysql
service mysql start
tar备份十分简单,缺点在于要停掉mysql才可以,备份受mysql版本限制,因为不同版本的数据库文件不可以混用,数据结构不一样

利用mysqldump备份
[root@centos129 mysql]# mysqldump --user=root -p haha > /tmp/mysql.sql ##备份haha数据库
Enter password:
[root@centos130 ~]# mysqldump --user=root -p --all-databases > mysql-all.sql ##备份整个数据库
Enter password:


F.A.Q
mysql 5.5.20一个报错
mysqldump: Got error: 1556: You can't use locks with log tables. when using LOCK TABLES
 提示你mysql log 表不能锁引起的,
可以使用--local-tables=0
mysqldump --user=root --local-tables=0 -p --all-databases > mysql-all.sql

二进制日志
二进制是mysql日志的一种,二进制日志包含了所有更新数据或者已经潜在更新了数据,
mysqldump还有一个致命缺陷是进行数据库备份时候 只能备份当时的数据库,思考以下,二进制日志 是保存对数据库所有的更改记录
 默认情况下mysql没有开启二进制日志 需要修改my.cnf 文件

[mysqld]下添加
bin-log
然后restart mysql

mysqlbinlog --stop-date="2012-02-23 13:20:20" /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -pnewbie
##恢复截至到 2012-2-23号13:20:20秒的所有数据
 mysqlbinlog --start-date="2012-02-23 13:21:20" /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -pnewbie
##恢复到13:21:20的前一秒

mysqlbinlog --start-date="2012-02-23 13:21:20" --stop-date="2012-02-23 13:22:00" /usr/local/mysql/data/mysql-bin.000001 > /tmp/sql.sql
在tmp下创建sql.sql命令,显示执行13:21:20到13:22:00的所有数据


如果二进制日志中的位置号用
于停止和继续恢复操作,应进行注释。用 log_pos 加一个数字来标记位置。使用位置号恢

[root @server1 mysql ] #mysqlbinlog --stop-position="368312" /var/log/mysql/bin.000001 \
| mysql -u root
-pmypwd
[root @server1 mysql ] #mysqlbinlog --start-position="368315" /var/log/mysql/bin.00000  \
| mysql -u root
-pmypwd
上面的第 1 行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到
二进制日志结束的所有事务。因为 mysqlbinlog 的输出包括每个 SQL 语句记录之前的 SET
TIMESTAMP 语句,恢复的数据和相关 MySQL 日志将反应事务执行的原时间。

mysqlAB复制

mysql没有增量复制机制,当数据库太大的时候备份是一个大问题,mysl提供了ab复制的机制,从库所保存的数据和主库同步,
从库去读取主库 的二进制日志文件,并按照主库的二进制文件的记录对从库进行同样的操作,以达到从库与
主库内容同步的效果。要想实现双机的热备首先要了解主从数据库服务器的版本的需求,还有一个基本的原则就是作为从数据库的数据库版本可以
高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本


AB:实验
172.16.148.129主Mysql服务器
172.16.148.130从Mysql服务器

主Mysql服务器设置
service mysqld stop
vim /etc/my.cnf
[mysqld]
 server-id=1
 log-bin=log
service mysqld start
增加salve用户用户slave链接master
grant replication slave,reload,super on *.* to slave@172.16.148.130 identified by '密码';
flush privileges;
service mysqld restart

从Mysql服务器设置
service mysqld stop
vim /etc/my.cnf
[mysqld]
 server-id=2
 master-host=172.16.148.129
 master-user=slave
 master-password=密码
service mysqld start
slave start;
load data from master;
show slave status\G;

问题解决:
当show slave status\G;Slave_SQL-Running值为No时,删除/var/lib/mysql下的mysql.info与relay-log.info
当show slave status\G;Slave_IO-Running值为No时,执行 master_log_file='log.00000X',master_log_pos=x 具体的值在状态表中查找,或是在主服务器的mysql日志中查找
当开启selinux时无法打开数据库时:
chcon -R -t mysqld_db_t /var/lib/mysql
service mysqld start
初始化数据库:  mysql_install_db