MySQL5.7下面,误操作导致的drop table db1.tb1; 的恢复方法:

一.实习内容

–用户定义函数的分类:

 

  
利用wamp进行MySQL上机实习,建立数据库和一个学生信息表,并能对建的表进行数据插入、修改、查询和删除等内容。

/*
1.标量函数
2.表值函数
  2.1内联表值函数  返回单个SELECT语句,
它没有相关的返回变量和函数体
  2.2多语句表值函数  是视图和存储过程的结合 可嵌套

0、停业务数据写入。【iptables封禁】

 

*/

 

二.实习目的

标量函数

--标量函数
IF EXISTS(SELECT * FROM sysobjects    WHERE name='fun_SeeEverySortAmount')
    DROP FUNCTION fun_SeeEverySortAmount
GO
CREATE FUNCTION fun_SeeEverySortAmount(@class varchar(20))
RETURNS INT
AS
    BEGIN
        DECLARE @Amount int
        SELECT @Amount=Amount FROM CommoditySort C INNER JOIN CommodityInfo I ON C.SortId=I.SortId
        WHERE I.CommodityName=@class
        RETURN @Amount
    END
GO

1、从备份服务器上拉取最新的一个全备文件,恢复到一个临时的服务器上,解压并启动mysqld。

能将课堂上所学的内容运用到实际的上机操作中,进一步加深和巩固所学的知识,通过上机了解在课堂上没学到的或是没有重视的内容,真正的去掌握MySQL。

执行:

2、在这台新的slave上执行如下命令:

 

--执行
DECLARE @Amount int
EXEC @Amount= fun_SeeEverySortAmount '苹果iPhone6'
PRINT '苹果iPhone6的库存量为:'+CONVERT(varchar(20),@Amount)

2.1 先配置好复制关系, change master to
到当前误操作的服务器,但是不要启动复制进程。【类似如下命令】

三.实习步骤

结果:

1
2
3
4
5
6
>CHANGE MASTER TO 
MASTER_HOST='172.16.20.73',
MASTER_USER='rpl',
MASTER_PASSWORD='rpl',
master_log_file='master-bin.000005',
master_log_pos=245;

1.建立数据库

图片 1

 

(1)首先查看服务器上的数据库

内联表值函数

--内联表值函数 返回单个SELECT语句, 它没有相关的返回变量和函数体
IF EXISTS (SELECT * FROM sysobjects WHERE name='fun_inlineSeeEverySortAmount')
    DROP FUNCTION fun_inlineSeeEverySortAmount
GO
CREATE FUNCTION fun_inlineSeeEverySortAmount(@class varchar(20))
RETURNS table
AS
    RETURN
        (
            SELECT Amount FROM CommodityInfo I 
            WHERE I.CommodityName=@class
        )
GO

2.2 在新的slave上执行复制过滤操作:

      使用show语句查看当前的数据库

执行:

1
> CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('db1.tb1');

输入:show databases;

--执行 调用内联函数和视图的使用一样
SELECT Amount 数量 FROM fun_inlineSeeEverySortAmount('苹果iPhone6')

2.3 开启slave 复制,到出问题的地方之前停下来

输出:mysql> show databases;

结果:

1
2
> start slave io_thread ;
> start slave sql_thread until master_LOG_FILE='mysql-bin.000010',master_LOG_POS=10020;   -- 执行到最后一次没问题的位移点

图片 2

图片 3

 

4 rows in set (0.00 sec)

多语句表值函数

2.4 在slave上跳过这个误操作的事务

(2)建立自己的数据库

--多语句表值函数  是视图和存储过程的结合 可嵌套
--如果一件商品的销售数量超过3000则为销量品,1000-3000为一般商品,0-1000 为需要促销
IF EXISTS (SELECT * FROM sysobjects WHERE name='fun_MutilateStatementSalesSort')
    DROP FUNCTION fun_MutilateStatementSalesSort
GO
CREATE FUNCTION fun_MutilateStatementSalesSort(@class varchar(20))
RETURNS @salessort table(
            商品名 varchar(20),
            单价 money,
            商品类型 varchar(20),
            销售量     int,
            商品销售类型 varchar(20)
        )
AS
    BEGIN
        INSERT INTO @salessort
        SELECT I.CommodityName,I.InPrice,S.SortName,SUM(O.Amount),CASE
                                                                WHEN SUM(O.Amount)>3000 THEN '销量品'
                                                                WHEN SUM(O.Amount) BETWEEN 1000 AND 3000 THEN '一般商品'
                                                                WHEN SUM(O.Amount) BETWEEN 0 AND 1000 THEN '需要促销'
                                                            END
        FROM CommodityInfo I INNER JOIN CommoditySort S ON I.SortId=S.SortId
                            INNER JOIN OrderInfo O ON O.CommodityId =I.CommodityId
        WHERE I.CommodityName=@class
        GROUP BY I.CommodityName,I.InPrice,S.SortName
        RETURN
    END
GO
1
2
3
4
5
6
set GTID_NEXT='56bc2f04-7556-11e8-b3b6-000c29ba98ce:1492' ;  -- 这里的这个就是应该跳过的那个事务(可以从主库的binlog里面找到这个gtid编号)
begin ;
commit ;
set GTID_NEXT="AUTOMATIC";
> start slave ;
> show slave status \G 查看复制情况

利用create database创建数据库CXL;

执行:

 

输入:create database CXL;

--执行 它相当于一个表
SELECT* FROM fun_MutilateStatementSalesSort('苹果MD760')
SELECT* FROM fun_MutilateStatementSalesSort('尼康D3300') 
SELECT* FROM fun_MutilateStatementSalesSort('小米平板')

2.5 将这个从库的db1.tb1
通过mysqldump方式导出,然后倒入到线上误操作的实例里面。
【大表的话,可以用xtrabackup备份单表,然后import倒入表空间来完成数据的倒入】

输出:Query OK, 1 row affected (0.02 sec)

结果:

 

则数据库创建成功。

图片 4

 

 

2.建立数据库表

(1)数据库建好以后,我们在所建的数据库中建立一个学生个人信息表,首先需要进入建好的数据库。

输入:use cxl;

输出:Database changed

这样就进入了之前建好的数据库里。

(2)创建数据表

首先进入建好的数据库中看看库里有哪些表;

    输入:show tables;

    输出:Empty set (0.00 sec)

这说明在刚刚建立好的库里没有任何的表;接下来需要在所建的数据库CXL里建立学生信息表,使用create
table创建表cxl。表的内容包括学生的ID,姓名,性别,专业,班级和电话号码。

  输入:create table cxl

    -> (

    -> ID int(11) not null,

    -> NAME char(50) not null,

    -> SEX char(5) not null,

    -> MAJOR char(50) not null,

    -> Classnumber int(11) not null,

    -> Phonenumber char(11) not null,

    -> PRIMARY KEY (ID)

发表评论

电子邮件地址不会被公开。 必填项已用*标注