MySQL数据库应用合集的写作暂时告一段落,合集的文章侧重于数据库和表的管理,数据的添加、修改、删除、查询、计算等操作,以及视图、存储过程等元素的应用,但这些还属于数据库功能的基础应用;对于MySQL这类功能强大的数据库系统来说,这只是开始,本文将讨论关于MySQL数据库的一些主题,有需要可以进一步深入学习和研究。
如果数据库服务能够暂时停止,那么问题就简单多了,此时,最简单的数据备份方法就是将MySQL的安装目录整体备份,如压缩打包、复制到移动存储器等方法。有了MySQL完整的安装目录,还可以在需要的计算机上安装新的服务,从而完成数据库整体恢复或复制,具体操作方法可以参考本合集的第一篇文章。
MySQL工具中,mysqldump可以完成数据的备份与恢复,它的工作原理是将数据库元素的创建和数据的添加操作生成为SQL文件,然后可以根据SQL恢复数据库元素和数据。如果不想使用命令行,在HeidiSQL中也可以操作。打开HeidiSQL,通过菜单“工具”>>“导出数据库为SQL脚本”打开“表工具”窗口,如下图所示。
“表工具”窗口中,左侧的树状结构可以选中需要操作的数据库,如示例中的cdb_demo数据库(位置1)。右侧的“SQL导出”页中,需要注意的设置包括:
设置完成后,点击右下角的“导出”按钮即可将选中的数据库元素和数据的处理SQL保存到指定的文件。
下图中的选项会完全重建cdb_demo数据库、表等元素,并添加所有数据,SQL文件会保存在D盘的cdb_demo_bak.sql。
接下来,可以将cdb_demo数据库删除,然后通过刚刚导出的SQL文件恢复。如果文件较小,可以通过HeidiSQL菜单“文件”>>“加载SQL文件”打开导出的文件,然后运行;如果数据量较大,也可以直接运行,此时使用菜单项“文件”>>“运行SQL文件”,在弹出的窗口中选择导出的SQL文件并确认操作即可执行。
实际工作中,数据同步、备份与恢复是一个非常重要的问题,是应用整体架构在设计时就需要考虑的问题,也是数据库管理员必须掌握的技能;需要时可以阅读专业的图书深入学习数据库的管理工作。
简单的说,事务(transcation)可以看作一组操作,这些操作应该全部成功完成,否则就什么也不做。事务使用start transcation或begin语句开始;事务中,可以使用rollback语句回滚操作,使用commit语句提交操作,也可以使用savepoint语句设置保存点,以便在需要时回滚到(rollback to)指定的操作位置。
下面的代码会创建事务演示用的表和初始数据,可以在HeidiSQL中执行。
use cdb_demo; create table t300( recid bigint not null auto_increment primary key, f1 varchar(30) not null unique, f2 decimal(15,3) not null )engine=innodb default charset='utf8mb4'; insert into t300(f1,f2) values('user01',1000), ('user02',1500), ('user03',600);
代码中创建了t300表,除了ID字段recid,只创建了两个字段,f1字段可以视为账号,f2字段可以视为余额或点数等类似的数据。
关于事务,最典型的例子就是转账,如t300表中,需要将user01的金额(f2)转2000到user02。实际操作中,首先需要判断user01的金额(f2)是否大于或等于2000,如果是则执行转账操作,如果否则通过回滚取消操作。
对于比较复杂一些的事务,一般会定义在存储过程中完成,下面的代码会通过一个存储过程演示事务的基本应用。
use cdb_demo; delimiter // create procedure sp_t300a( in u1 varchar(30),in u2 varchar(30),in n decimal(15,3),out result bigint) begin start transaction; set result=ifnull((select recid from t300 where f1=u1 and f2>=n),0); if result=0 then rollback; else update t300 set f2=f2-n where f1=u1; update t300 set f2=f2+n where f1=u2; commit; end if; end; // delimiter ;
代码中创建了sp_t300a存储过程,其参数分别是:u1表示金额转出账户名,u2表示金额转入账户名,n表示转账金额,result为输出参数为0时表示转账失败,非0值时会返回转出账号的recid值。
存储过程主体中,首先使用start transaction语句开始事务,然后会通过select语句读取账号为转出人(u1)、且金额大于或等于指定金额(n)的记录的recid数据,对于读取的数据,如果是非空数值则赋值给result参数,否则将result赋值为0。然后,当result为0时调用rollback语句回滚,取消之前的所有操作,请注意,这里并没有可回滚的操作;如果result大于0,则通过2条update语句更新t300表的数据,第一条是将转出账号减去指定的金额,第二条是将转入账号加上指定的金额;最后,通过commit语句提交事务所做的修改,即将事务所做的修改真正保存到数据库。
请注意,rollback语句能够回滚的操作包括insert、update和delete,其它语句(如create、drop、alter等)所做的修改不能回滚。
下面的代码会调用sp_t300a存储过程。
use cdb_demo; call sp_t300a('user01','user02',2000,@result); select @result;
执行代码会返回0,因为user01用户的余额只有1000,如果将第3个参数修改为200,则返回1,即user01用户的记录ID。正确执行后,t300表的数据如下图所示。
下面的代码可以将user02的金额转给user03账号600。
use cdb_demo; call sp_t300a('user02','user03',600,@result); select @result;
正确执行后会显示2,即输出账号user02的记录ID。再次查询t300表的数据如下图所示。
这里演示了事务的基本应用,应用开发过程中,特别是需要并发操作的Web应用,事务的应用是非常重要的,本网站(http://caohuayu.com)和公众号后续文章中会有相关内容。
与数据的备份工作一样,性能优化也是数据库管理中非常重要的工作。性能优化工作中,对于数据库系统技术的熟练程度和应用经验都是很重要的,下面是一些关于性能优化需要考虑的问题,可以根据这些提示进一步深入研究。
硬件是第一要素,无论如何,更快的计算机都是数据库系统运行更高效的保证。
数据库中每一次查询、连接、主键和唯一约束的判断都是需要系统资源的,所以,在编写SQL语句时,要理解它们的工作过程,并找出最优答案。
MySQL数据库系统参数的设置并没有唯一的答案,只有结合实现应用环境,找到参数的最佳值才会使得应用系统能够发挥最大的性能。
综合考虑应用的整体设计和执行效率。如果数据库只是工作或应用环境中的一部分,则需要综合一考虑整个工作环境的性能问题,比如,可能的并发操作是什么?有多少访问量?如何合理分配资源等。
不断优化和改进。数据库系统的性能优化工作不是一蹴而就的,需要在工作中不断测试和验证,在实践中不断查找最合适的优化方案。
从Excel到数据库系统,我们掌握的数据处理工具已经有了质的飞越,但随着处理数据的数量越来越多、计算越来越复杂、结果应用要求越来越高,这就要求掌握的工具也要越来越丰富;而进一步提高数据处理效率,如数据的导入导出、格式转换、数据采集、结果发布等工作,都可以通过完整的应用系统来完成,接下来的文章会介绍更多的软件开发技术,以帮助读者完成更多、更丰富的数据处理工作。