mysql进阶

完整数据库备份

1.完整数据库备份对整个数据库进行备份。这包括对部分事务日志进行备份,以便能够恢复完整数据库备份。完整数据库备份表示备份完成时的数据库。

2.数据库备份易于使用。完整数据库备份包含数据库中的所有数据。对于可以快速备份的小数据库而言,最佳方法就是使用完整数据库备份。但是,随着数据库的不断增大,完整备份需花费更多时间才能完成,并且需要更多的存储空间。因此,对于大型数据库而言,您可以用差异备份来补充完整数据库备份。有关详细信息,请参阅差异数据库备份。

注意:针对数据库备份,TRUSTWORTHY 设置为 OFF。有关如何将 TRUSTWORTHY 设置为 ON 的详细信息,请参阅ALTER DATABASE (Transact-SQL)。

3.在简单恢复模式下使用数据库备份

在简单恢复模式下,每次备份后,如果出现严重故障,数据库将有可能丢失工作。每次更新都会增加丢失工作的风险,这种情况将一直持续到下一次完整备份。这时,工作丢失风险将变为零,并开始新一轮的工作丢失风险。

在简单恢复模式下,备份之间的工作丢失风险随着时间的推移而增加。下图显示了仅使用完整数据库备份的备份策略的工作丢失风险。

下例说明了如何使用 WITH FORMAT 覆盖任意现有备份并创建新媒体集,从而创建一个完整数据库备份。然后,此示例将备份事务日志。在现实情况下,您必须执行一系列的定期日志备份。

-- Back up the AdventureWorks database to new media set.
BACKUP DATABASE AdventureWorks
    TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\BACKUP\AdventureWorksFullRM.bak' 
    WITH FORMAT;
GO

4.在完整恢复模式下使用数据库备份

对于使用完整恢复模式和大容量日志恢复模式的数据库而言,需要执行事务日志备份。下图显示了在完整恢复模式下可以使用的复杂性最小的备份策略。

注意:如果有两个或更多必须在逻辑上保持一致的完整恢复模式数据库,则最好执行特殊步骤,以确保这些数据库的可恢复性。有关详细信息,请参阅使用标记的事务(完全恢复模式)。

5.创建完整数据库备份

完整数据库备份应在单个操作中创建,并通常计划为按设定的间隔执行。

创建完整数据库备份所要求的 BACKUP 语法是:

BACKUP DATABASE database_name TO backup_device

差异备份

1.差异备份基于差异备份所包含数据的前一次最新完整备份。差异备份仅捕获自该次完整备份后发生更改的数据。这称为差异备份的“基准”**。差异备份仅包括建立差异基准后更改的数据。在 SQL Server 2005 中,差异文件备份的速度非常快,因为 SQL Server 数据库引擎会跟踪自创建差异基准之后所做的更改。

2.每种主要的文件备份类型都可用作一系列差异备份的基准,例如:

  • 差异数据库备份
  • 部分差异备份
  • 差异文件备份

作为一种最佳做法,差异备份的范围应与其基准的范围相同。因此,差异文件备份应基于包括同一组文件和(或)文件组的文件备份。

进行差异备份时通常不需要考虑特殊事项。但建议您注意以下这些情况:

  • 对某个只读数据库进行差异备份。对于只读数据库,单独使用完整备份比同时使用完整备份和差异备份更容易管理。有关详细信息,请参阅备份只读数据库。 完整备份和文件备份混在一起,这创建了多基准差异备份。
  • 您可以创建一个多基准差异备份,其范围将大于单基准备份。但是,多基准差异备份的还原较为复杂,除专家级用户之外,通常应避免使用这种方式。有关详细信息,请参阅使用多基准差异备份。
  • 需要在更改文件组的 IsReadOnly 属性之后执行部分差异备份。有关详细信息,请参阅差异部分备份。

恢复

1.一般恢复

  • mysqlbinlog --stop-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码

2.基于位置的恢复

  • 恢复数据到指定位置 mysqlbinlog --stop-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码

  • 从指定的位置开始恢复数据 mysqlbinlog --start-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码

3.基于时间点的恢复

  • 从日志开头截止到某个时间点的恢复 mysqlbinlog [–no-defaults] --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码

  • 从某个时间点到日志结尾的恢复 mysqlbinlog [–no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’

  • 从某个时间点到某个时间点的恢复 mysqlbinlog [–no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’ --stop-datetime=’年-月-日小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码

Group by

1.GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)

MariaDB [zs]> create table test(a varchar(20),b varchar(20),c varchar(20));
Query OK, 0 rows affected (0.003 sec)

MariaDB [zs]> insert test value(1,'leile','kao');
Query OK, 1 row affected (0.001 sec)

MariaDB [zs]> insert test value(1,'kule','kao');
Query OK, 1 row affected (0.001 sec)

MariaDB [zs]> insert test value(1,'guile','kao');
Query OK, 1 row affected (0.001 sec)

MariaDB [zs]> insert test value(1,'sile','kao');
Query OK, 1 row affected (0.001 sec)

MariaDB [zs]> insert test value(1,'hello','nihao');
Query OK, 1 row affected (0.002 sec)

MariaDB [zs]> insert test value(1,'zhangsan','nihao');
Query OK, 1 row affected (0.001 sec)

MariaDB [zs]> insert test value(1,'wangwu','nihao');
Query OK, 1 row affected (0.001 sec)

MariaDB [zs]> insert test value(1,'wangwu','nihao');
Query OK, 1 row affected (0.002 sec)

MariaDB [zs]> insert test value(1,'wangwu','nihao');
Query OK, 1 row affected (0.001 sec)

MariaDB [zs]> insert test value(1,'wangwu','nihao');
Query OK, 1 row affected (0.001 sec)

MariaDB [zs]> insert test value(1,'leile','kao');
Query OK, 1 row affected (0.001 sec)

MariaDB [zs]> insert test value(1,'leile','kao');
Query OK, 1 row affected (0.001 sec)

MariaDB [zs]> select * from test;
+------+----------+-------+
| a    | b        | c     |
+------+----------+-------+
| 1    | leile    | kao   |
| 1    | kule     | kao   |
| 1    | guile    | kao   |
| 1    | sile     | kao   |
| 1    | hello    | nihao |
| 1    | zhangsan | nihao |
| 1    | wangwu   | nihao |
| 1    | wangwu   | nihao |
| 1    | wangwu   | nihao |
| 1    | wangwu   | nihao |
| 1    | leile    | kao   |
| 1    | leile    | kao   |
+------+----------+-------+
12 rows in set (0.001 sec)

MariaDB [zs]> select count(a),b from test group by b;
+----------+----------+
| count(a) | b        |
+----------+----------+
|        1 | guile    |
|        1 | hello    |
|        1 | kule     |
|        3 | leile    |
|        1 | sile     |
|        4 | wangwu   |
|        1 | zhangsan |
+----------+----------+
7 rows in set (0.000 sec)

MariaDB [zs]> select count(1),c from test group by c;
+----------+-------+
| count(1) | c     |
+----------+-------+
|        6 | kao   |
|        6 | nihao |
+----------+-------+
2 rows in set (0.000 sec)

inner by(内连接)、left join(左连接)、right by(右连接)

MariaDB [mysql]> create table tablea(id int,name varchar(30));
Query OK, 0 rows affected (0.002 sec)

MariaDB [mysql]> create table tableb(id int,job int,parent_id int);
Query OK, 0 rows affected (0.002 sec)

MariaDB [mysql]> insert tablea values(1,'zhangsan'),(2,'wangwu'),(3,'wangqing');
Query OK, 3 rows affected (0.002 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [mysql]> insert tableb values(1,24,1),(2,33,2),(3,35,4);
Query OK, 3 rows affected (0.002 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [mysql]> select * from tablea;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | wangwu   |
|    3 | wangqing |
+------+----------+
3 rows in set (0.000 sec)

MariaDB [mysql]> select * from tableb;
+------+------+-----------+
| id   | job  | parent_id |
+------+------+-----------+
|    1 |   24 |         1 |
|    2 |   33 |         2 |
|    3 |   35 |         4 |
+------+------+-----------+
3 rows in set (0.000 sec)

内连接

MariaDB [mysql]> select tablea.*,tableb.* from tablea inner join tableb on tablea.id = tableb.parent_id;
+------+----------+------+------+-----------+
| id   | name     | id   | job  | parent_id |
+------+----------+------+------+-----------+
|    1 | zhangsan |    1 |   24 |         1 |
|    2 | wangwu   |    2 |   33 |         2 |
+------+----------+------+------+-----------+
2 rows in set (0.000 sec)

左连接

MariaDB [mysql]> select tablea.*,tableb.* from tablea left join tableb on tablea.id = tableb.parent_id;
+------+----------+------+------+-----------+
| id   | name     | id   | job  | parent_id |
+------+----------+------+------+-----------+
|    1 | zhangsan |    1 |   24 |         1 |
|    2 | wangwu   |    2 |   33 |         2 |
|    3 | wangqing | NULL | NULL |      NULL |
+------+----------+------+------+-----------+
3 rows in set (0.000 sec)

右连接

MariaDB [mysql]> select tablea.*,tableb.* from tablea right join tableb on tablea.id = tableb.parent_id;
+------+----------+------+------+-----------+
| id   | name     | id   | job  | parent_id |
+------+----------+------+------+-----------+
|    1 | zhangsan |    1 |   24 |         1 |
|    2 | wangwu   |    2 |   33 |         2 |
| NULL | NULL     |    3 |   35 |         4 |
+------+----------+------+------+-----------+
3 rows in set (0.000 sec)
上一篇:大数据学习目录


下一篇:UVA1374 快速幂计算 Power Calculus(IDA*)