Mysql处理
当主从复制遇到错误:
手动设置:>stop slave;
>set global sql_slave_skip_counter=1; #跳过事物数量
>start slave;
修改配置:vi /etc/my.cnf
[mysqld]
slave-skip-errors=1062,1053
slave-skip-errors=all #跳过所有错误
动态设置跳过错误:
>set global slave_exec_mode =strict;
严格执行策略。大多数情况下遇到错误,同步就会终止。等待错误解决。
>set global slave_exec_mode =idempotent;
这个设置,可以允许同步跳过
一主多从--主宕机从库切换主:
1、等待所有从的relay-log与主的binlog同步完成;
2、在所有从上执行:
>stop slave io_thread;
>show processlist;
查看到Slave_SQL_Running_State: Slave has read allrelay log; waiting for more updates;表示更新完毕
查看所有从的数据库目录下master.info,选择最大的POS为主(可能pos会一样大,选择性能和负载较好做主)
然后删除master.info和relay-log.info文件;
修改配置文件:
开启binlog,注释log-slaves-updates=1和read-only=1
>reset master;
> show binary logs;
mysql误操作恢复(一定要开启binlog,否则无法恢复,且之前有全量备份):
简单例子:
安装:yum -y install mariadb mariadb-server
编辑配置:vim /etc/my.cnf
开启binlog:log-bin=mysql-bin
开启服务:systemctl restart mariadb.service
登录数据库:mysql
>create database test_abc;
>use test_abc;
>create table test_1( id int not null auto_increment, name char(20) not null, age int not null, primary key(id)) engine=InnoDB;
>desc test_1;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(20) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
+-------+----------+------+-----+---------+----------------+
> insert into test_1 values(1,"haha",12);
> insert into test_1 values(2,"hehe",20);
> insert into test_1 values(3,"sisi",16);
> select * from test_1;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | haha | 12 |
| 2 | hehe | 20 |
| 3 | sisi | 16 |
| 5 | xixi | 17 |
| 6 | xexe | 27 |
| 7 | enen | 22 |
+----+------+-----+
6 rows in set (0.00 sec)
退出数据库,进程全量备份:mysqldump -B -F -R -x --master-data=2 test_abc|gzip >/opt/backup/test_abc_$(date +%F).sql.gz
再次登录数据库:mysql(进行误操作)
>insert into test_1 values(5,"xixi",17);
> insert into test_1 values(6,"xexe",27);
> insert into test_1 values(7,"enen",22);
> select * from test_1;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | haha | 12 |
| 2 | hehe | 20 |
| 3 | sisi | 16 |
| 5 | xixi | 17 |
| 6 | xexe | 27 |
| 7 | enen | 22 |
+----+------+-----+
> drop database test_abc;
> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
退出数据库,进行恢复:
cd /opt/backup/
gzip -d test_abc_2017-01-10.sql.gz
查找全量备份之后操作的binlog:
grep CHANGE test_abc_2017-01-10.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=245;
将全量之后操作的binlog文件都拷贝到备份的目录:
cp /var/lib/mysql/mysql-bin.000004 .
将binlog转换为可执行sql:
mysqlbinlog -d test_abc mysql-bin.000004 > 04bin.sql
编辑转换的SQL,去除drop操作:
vim 04bin.sql
把之前binlog备份:
mkdir drop_mysql
mv /var/lib/mysql/mysql-bin.* drop_mysql/
tar -zcf drop_mysql.tgz drop_mysql/
恢复操作:
mysql < test_abc_2017-01-10.sql
mysql < 04bin.sql
> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| test_abc |
+--------------------+
5 rows in set (0.00 sec)