图片 13

MySQL编译功能,MySQL定时备份数据库及数据恢复

Navicat for MySQL定时备份数据库及数据恢复,navicatmysql

在做数据库修改或删除操作中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库。本篇文章主要讲述Navicat
for
MySQL定时备份数据库和数据恢复等功能,同时可以定时播放电影等设置,希望对您有所帮助,如果文章中存在错误或不足之处,还请海涵~
 

MySQL的预编译功能,MySQL编译功能

  1、预编译的好处
  大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能。什么是预编译功能呢?它有什么好处呢?
  当客户发送一条SQL语句给服务器后,服务器总是需要校验SQL语句的语法格式是否正确,然后把SQL语句编译成可执行的函数,最后才是执行SQL语句。其中校验语法,和编译所花的时间可能比执行SQL语句花的时间还要多。
  如果我们需要执行多次insert语句,但只是每次插入的值不同,MySQL服务器也是需要每次都去校验SQL语句的语法格式,以及编译,这就浪费了太多的时间。如果使用预编译功能,那么只对SQL语句进行一次语法校验和编译,所以效率要高。
  2、MySQL执行预编译 MySQL执行预编译分为如三步:

  • 执行预编译语句,例如:prepare myfun from ‘select * from t_book
    where bid=?’
  • 设置变量,例如:set @str=’b1′
  • 执行语句,例如:execute myfun using @str

如果需要再次执行myfun,那么就不再需要第一步,即不需要再编译语句了:

  • 设置变量,例如:set @str=’b2′
  • 执行语句,例如:execute myfun using @str

通过查看MySQL日志可以看到执行的过程:
图片 1  

 

3、使用Statement执行预编译
使用Statement执行预编译就是把上面的SQL语句执行一次。

Connection con = JdbcUtils.getConnection();
Statement stmt = con.createStatement();
stmt.executeUpdate("prepare myfun from 'select * from t_book where bid=?'");
stmt.executeUpdate("set @str='b1'");
ResultSet rs = stmt.executeQuery("execute myfun using @str");
while(rs.next()) {
    System.out.print(rs.getString(1) + ", ");
    System.out.print(rs.getString(2) + ", ");
    System.out.print(rs.getString(3) + ", ");
    System.out.println(rs.getString(4));
}

stmt.executeUpdate("set @str='b2'");
rs = stmt.executeQuery("execute myfun using @str");

while(rs.next()) {
    System.out.print(rs.getString(1) + ", ");
    System.out.print(rs.getString(2) + ", ");
    System.out.print(rs.getString(3) + ", ");
    System.out.println(rs.getString(4));
}

rs.close();
stmt.close();
con.close();

 

4、useServerPrepStmts参数
  默认使用PreparedStatement是不能执行预编译的,这需要在url中给出useServerPrepStmts=true参数(MySQL
Server
4.1之前的版本是不支持预编译的,而Connector/J在5.0.5以后的版本,默认是没有开启预编译功能的)。
  例如:jdbc:mysql://localhost:3306/test?useServerPrepStmts=true
  这样才能保证mysql驱动会先把SQL语句发送给服务器进行预编译,然后在执行executeQuery()时只是把参数发送给服务器。

Connection con = JdbcUtils.getConnection();
String sql = "select * from t_book where bid=?";
PreparedStatement pstmt = con.prepareStatement(sql);

pstmt.setString(1, "b1");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
    System.out.print(rs.getString(1) + ", ");
    System.out.print(rs.getString(2) + ", ");
    System.out.print(rs.getString(3) + ", ");
    System.out.println(rs.getString(4));
}

pstmt.setString(1, "b2");
rs = pstmt.executeQuery();
while(rs.next()) {
    System.out.print(rs.getString(1) + ", ");
    System.out.print(rs.getString(2) + ", ");
    System.out.print(rs.getString(3) + ", ");
    System.out.println(rs.getString(4));
}

rs.close();
pstmt.close();
con.close();

5、cachePrepStmts参数
  当使用不同的PreparedStatement对象来执行相同的SQL语句时,还是会出现编译两次的现象,这是因为驱动没有缓存编译后的函数key,导致二次编译。如果希望缓存编译后函数的key,那么就要设置cachePrepStmts参数为true。例如:
  jdbc:mysql://localhost:3306/test?useServerPrepStmts=true&cachePrepStmts=true

Connection con = JdbcUtils.getConnection();
String sql = "select * from t_book where bid=?";
PreparedStatement pstmt = con.prepareStatement(sql);

pstmt.setString(1, "b1");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
    System.out.print(rs.getString(1) + ", ");
    System.out.print(rs.getString(2) + ", ");
    System.out.print(rs.getString(3) + ", ");
    System.out.println(rs.getString(4));
}

pstmt = con.prepareStatement(sql);
pstmt.setString(1, "b2");
rs = pstmt.executeQuery();
while(rs.next()) {
    System.out.print(rs.getString(1) + ", ");
    System.out.print(rs.getString(2) + ", ");
    System.out.print(rs.getString(3) + ", ");
    System.out.println(rs.getString(4));
}

rs.close();
pstmt.close();
con.close();

6、打开批处理
  MySQL的批处理也需要通过参数来打开:rewriteBatchedStatements=true

1、预编译的好处
大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能。什么是预编译功能呢?它…

MySQL参数log_bin_trust_function_creators介绍,

 

MySQL的有个参数log_bin_trust_function_creators,官方文档对这个参数的介绍、解释如下所示:

 

 

log_bin_trust_function_creators

Command-Line Format

–log-bin-trust-function-creators

System Variable

Name

log_bin_trust_function_creators

Variable Scope

Global

Dynamic Variable

Yes

Permitted Values

Type

boolean

Default

FALSE

 

 

This variable applies when binary logging is
enabled. It controls whether stored function creators can be trusted not
to create stored functions that will cause unsafe events to be written
to the binary log. If set to 0 (the default), users are not permitted to
create or alter stored functions unless they have the SUPER privilege in addition to the
CREATE
ROUTINE or
ALTER
ROUTINE privilege. A setting of 0 also enforces the restriction
that a function must be declared with the DETERMINISTIC characteristic, or with the READS SQL DATA or NO SQL characteristic. If the
variable is set to 1, MySQL does not enforce these restrictions on
stored function creation. This variable also applies to trigger
creation. See Section
23.7, “Binary Logging of Stored Programs”.

 

 

简单介绍一下,当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE
ROUTINE或ALTER ROUTINE特权之外的SUPER权限。
设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO
SQL特性声明函数的限制。
如果变量设置为1,MySQL不会对创建存储函数实施这些限制。
此变量也适用于触发器的创建。 请参见第23.7节“Binary Logging of Stored
Programs”。

 

下面我们测试一下,当开启二进制日志后,如果变量log_bin_trust_function_creators为OFF,那么创建或修改存储函数就会报“ERROR
1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS
SQL DATA in its declaration and binary logging is enabled (you *might*
want to use the less safe log_bin_trust_function_creators
variable)”这样的错误,如下所示:

 

mysql> show variables like 'log_bin';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       | ON    |

+---------------+-------+

1 row in set (0.00 sec)

 

mysql>  show variables like '%log_bin_trust_function_creators%';

+---------------------------------+-------+

| Variable_name                   | Value |

+---------------------------------+-------+

| log_bin_trust_function_creators | OFF   |

+---------------------------------+-------+

1 row in set (0.00 sec)

 

mysql> 

mysql> DELIMITER //

mysql> CREATE FUNCTION GET_UPPER_NAME(emp_id INT)

    -> RETURNS VARCHAR(12)

    -> BEGIN

    ->   RETURN(SELECT UPPER(NAME) FROM TEST WHERE ID=emp_id);

    -> END

    -> //

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

mysql> 

 

在调用存储函数时,也会遇到这个错误,如下测试所示:

 

 

mysql> DELIMITER ;

mysql> set global log_bin_trust_function_creators=1;

Query OK, 0 rows affected (0.00 sec)

 

mysql> DELIMITER //

mysql> CREATE FUNCTION GET_UPPER_NAME(emp_id INT)

    -> RETURNS VARCHAR(12)

    -> BEGIN

    ->   RETURN(SELECT UPPER(NAME) FROM TEST WHERE ID=emp_id);

    -> END

    -> //

Query OK, 0 rows affected (0.00 sec)

 

mysql> SELECT ID,

    ->        GET_UPPER_NAME(ID)

    -> FROM TEST;

    -> //

+------+--------------------+

| ID   | GET_UPPER_NAME(ID) |

+------+--------------------+

|  100 | KERRY              |

|  101 | JIMMY              |

+------+--------------------+

2 rows in set (0.00 sec)

 

mysql> DELIMITER ;

mysql> set global log_bin_trust_function_creators=0;

Query OK, 0 rows affected (0.00 sec)

 

mysql> SELECT ID,

    ->        GET_UPPER_NAME(ID)

    -> FROM TEST;

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

mysql> 

 

 

 

那么为什么MySQL有这样的限制呢?
因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,参数log_bin_trust_function_creators就会生效,限制存储函数的创建、修改、调用。那么此时如何解决这个问题呢?官方文档介绍如下,具体可以参考23.7
Binary Logging of Stored Programs

 

 

If you do not want to require function creators to
have the SUPER privilege (for example, if all users with the CREATE
ROUTINE privilege on your system are experienced application
developers), set the global log_bin_trust_function_creators system
variable to 1. You can also set this variable by using the
–log-bin-trust-function-creators=1 option when starting the server. If
binary logging is not enabled, log_bin_trust_function_creators does
not apply. SUPER is not required for function creation unless, as
described previously, the DEFINER value in the function definition
requires it.

 

If a function that performs updates is
nondeterministic, it is not repeatable. This can have two undesirable
effects:

        

·         It will make a
slave different from the master.

  

·         Restored data
will be different from the original data.

To deal with these problems, MySQL enforces the
following requirement: On a master server, creation and alteration of a
function is refused unless you declare the function to be deterministic
or to not modify data. Two sets of function characteristics apply
here:

      

·         The
DETERMINISTIC and NOT DETERMINISTIC characteristics indicate whether a
function always produces the same result for given inputs. The default
is NOT DETERMINISTIC if neither characteristic is given. To declare that
a function is deterministic, you must specify DETERMINISTIC
explicitly.

     

·         The CONTAINS
SQL, NO SQL, READS SQL DATA, and MODIFIES SQL DATA characteristics
provide information about whether the function reads or writes data.
Either NO SQL or READS SQL DATA indicates that a function does not
change data, but you must specify one of these explicitly because the
default is CONTAINS SQL if no characteristic is given.

·          

 

1:
如果数据库没有使用主从复制,那么就可以将参数log_bin_trust_function_creators设置为1。

 

mysql> set global log_bin_trust_function_creators=1;

 

这个动态设置的方式会在服务重启后失效,所以我们还必须在my.cnf中设置,加上log_bin_trust_function_creators=1,这样就会永久生效。

 

 

 

2:明确指明函数的类型,如果我们开启了二进制日志,
那么我们就必须为我们的function指定一个参数。其中下面几种参数类型里面,只有
DETERMINISTIC, NO SQL 和 READS SQL DATA
被支持。这样一来相当于明确的告知MySQL服务器这个函数不会修改数据。

 

1 DETERMINISTIC 不确定的

2 NO SQL 没有SQl语句,当然也不会修改数据

3 READS SQL DATA 只是读取数据,当然也不会修改数据

4 MODIFIES SQL DATA 要修改数据

5 CONTAINS SQL 包含了SQL语句

 

mysql> show variables like 'log_bin_trust_function_creators';

+---------------------------------+-------+

| Variable_name                   | Value |

+---------------------------------+-------+

| log_bin_trust_function_creators | OFF   |

+---------------------------------+-------+

1 row in set (0.00 sec)

 

mysql> DROP FUNCTION GET_UPPER_NAME;

Query OK, 0 rows affected (0.00 sec)

 

mysql> DELIMITER //

mysql> CREATE FUNCTION GET_UPPER_NAME(emp_id INT)

    -> RETURNS VARCHAR(12)

    -> READS SQL DATA

    -> BEGIN

    ->   RETURN(SELECT UPPER(NAME) FROM TEST WHERE ID=emp_id);

    -> END

    -> //

Query OK, 0 rows affected (0.01 sec)

 

mysql> DELIMITER ;

mysql> SELECT ID,

    ->        GET_UPPER_NAME(ID)

    -> FROM TEST;

+------+--------------------+

| ID   | GET_UPPER_NAME(ID) |

+------+--------------------+

|  100 | KERRY              |

|  101 | JIMMY              |

+------+--------------------+

2 rows in set (0.00 sec)

 

 

MySQL的有个参数log_bin_trust_function_creators,官方文档对这个参数的介绍、解释如下所示:
log_bin_trust…

一. 设置计划任务定时备份数据库

计划任务就是让电脑在指定的时间内执行指定的动作,这些动作可以是一个程序,也可以是一个批处理,但是至少是可以运行的!其实再通俗一点也就是相当于你在那个时间里面进行了对某个东西对鼠标双击的操作。

1.首先,创建数据库hcpmanage,表information,主要记录车票信息。

图片 2

 

2.点击”任务”->”新建批处理作业”,如下图所示。

图片 3

 

3.然后弹出的对话框中,双击可用任务”Backup
hcpmanage”,并选择任务。点击保存按钮,设置为”20170418bf”。

图片 4  图片 5

4.然后该备份文件就会出现在计划列表中,如下图所示。

图片 6

 

5.点击该”20170418bf”,设置计划任务,如下图所示。

图片 7

6.在弹出”计划”中设置每天23:58进行备份操作,如下图所示。

图片 8

 

7.点击”应用”,在弹出的”设置账户信息”中,输入开机密码,点击确定。

图片 9

其中常用设置如下所示,包括完成任务计划、空闲时间和电源管理等。

 

图片 10

8.当时间每天到达23:58时,数据库进行定时备份。其备份文件在”Windows/System32/Tasks”任务路径下,如下图所示。

 

图片 11

另一个备份psc文件所在路径:Navicat\MySQL\servers\test\hcpmanage(连接-数据库)。

 

图片 12

注意:在输入开机密码过程中,经常会报错”任务计划程序
再试着设置任务账户信息时出现错误”,如下图所示,解决方法见第三部分。

图片 13

 

 

发表评论

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

标签:
网站地图xml地图