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)

  

原文地址:https://www.cnblogs.com/songge1209/p/6269826.html