数据库全攻略:从类型到安全与优化
一、数据库类型大观
(一)关系型数据库
关系型数据库以表格形式存储数据,通过 SQL 语言进行操作,数据之间存在关联关系,适合复杂查询和事务处理。常见的关系型数据库有 MySQL、Oracle、SQL Server 等。关系型数据库具有以下特点:
- 存储方式:数据以行和列的形式存储,读取和查询方便。
- 存储结构:按照结构化的方法存储数据,可靠性和稳定性高,但修改数据表结构困难。
- 存储规范:将数据按照最小关系表的形式存储,便于数据管理。
- 扩展方式:只具备纵向扩展能力,在处理多张数据表操作时容易出现瓶颈。
- 查询方式:采用结构化查询语言(SQL),功能强大,可采用索引加快查询操作。
- 规范化:开发过程中需要对数据实体进行分割和规范化,过程复杂。
- 事务性:强调 ACID 规则,对事务操作支持良好,可保证数据强一致性,且能回滚事务。
- 读写性能:为保证数据一致性,读写性能在面对海量数据和高并发读写时会下降。
- 授权方式:部分关系型数据库需支付费用,免费的性能可能受限。
(二)非关系型数据库
非关系型数据库包括键值存储、文档数据库、列存储、图数据库等,用于存储半结构化和非结构化数据,灵活性高,适合大规模分布式系统和高并发读写操作。
- 键值存储数据库:类似哈希表,通过 key 来添加、查询或删除数据,性能及扩展性高。典型产品有 Memcached、Redis、MemcacheDB。
- 列存储数据库:将数据存储在列族中,适合应对分布式存储海量数据。典型产品有 Cassandra、HBase。
- 面向文档数据库:以文档形式存储数据,允许嵌套键值,查询效率更高。典型产品有 MongoDB、CouchDB。
- 图形数据库:将数据以图的方式存储,实体会被作为顶点,实体之间的关系则会被作为边。典型产品有 Neo4J、InforGrid。
(三)对象型数据库
对象型数据库直接存储面向对象语言中的对象,支持复杂对象模型,在处理复杂业务逻辑时更具优势。它可以更好地支持复杂的数据结构,如列表、数组和对象等。通常用于那些需要处理复杂数据和大规模并发操作的场景,比如电信网络管理、实时系统等。
(四)分布式数据库
分布式数据库分布在多个网络节点上,提供高可用性和高伸缩性,适用于云计算和大数据应用。分布式数据库的主要特点是数据分布在不同的网络节点上,能够提高数据的可用性和可靠性,适用于需要提高系统的容错能力和并发性能的场景。例如,分布式数据库可以通过分布式处理系统互相通信和协作,对用户来说,就像一个单一的数据库一样。
(五)云数据库
云数据库运行在云计算平台上,按需付费,易于扩展,无需关心安装和维护。云数据库具有可扩展性、高可用性、灵活性、成本效益以及数据安全性等特点。
- 可扩展性:可以根据需求轻松扩展或缩减存储和计算资源。例如亚马逊的 AWS 云数据库服务可以在需要处理大量数据的时候自动扩展,当需求降低时自动缩减。
- 高可用性:保证持续的服务和数据的持久性,多数云服务商能提供 99.9% 以上的服务可用性,且通常会在多个地理位置备份数据。
- 灵活性:可根据业务需求灵活选择数据库类型和配置,支持多种数据格式,能处理结构化、半结构化以及非结构化数据。
- 成本效益:与传统自建数据库相比,降低成本。消除硬件投资和维护成本,按使用量计费,避免资源浪费,减轻 IT 团队工作负担。
- 数据安全性:提供多种安全措施,包括数据加密、用户认证、访问控制等,定期进行安全审计,确保数据的安全性和完整性。
二、数据库安全要点
(一)数据库版本与组件选择
选择较高、稳定的数据库版本至关重要,这可以避免一些因版本漏洞触发的业务影响。例如,一个 ORA-04031 错误可能会引发结算系统 share_pool 的问题,导致应用程序链接失败。在选择数据库版本时,应充分考虑其稳定性和对业务的适应性。同时,明确生产数据库所需要使用的 Oracle 组件也非常重要,只选择满足使用环境的最小组件集,这样可以减少潜在的安全风险和资源占用。
(二)表管理
在表管理方面,备份表和临时表应进行规范化模式管理。使用独立的模式存储独立的业务对象,避免不同业务的数据相互干扰。在进行 DDL 创建备份或临时对象时,要明确变更管理存在风险,需强化变更管理。一个 schema 中应存储为完成某一个系统或模块而设计的表,不能将其他用途的数据表混合存储。将临时表、备份表进行独立的 schema 存储管理,分离备份表和临时表,这样既能避免对业务数据存储造成空间碎片和性能影响,又能有效降低数据备份和清理操作对业务运行的影响。
(三)用户权限安全
对于绝无必要的用户,应及时清理出数据库。如 Oracle 的测试用户 Scott,在生产环境中,应删除该用户及其相关对象,或者将其转移到测试环境中。对于已经被 LOCKED 的 Oracle 内置用户,需要评估是否在生产环境中使用,如果不需要使用,则可删除相关组件和用户。严格用户角色管理,防止权限授予过高,收回用户所具有的 resource 角色,创建权限限制更加严格的自定义角色。同时,收回用户中不需要的角色,确保用户只能执行其被授权的操作,降低安全风险。
(四)访问安全
规范数据库管理软件,实现管理软件的标准、统一化,防止因管理软件的不规范带来安全隐患。为了防止连入数据库的应用程序存在后门,造成数据库安全隐患,应检查所有连接数据库程序的安全性。通过使用门户监控登录数据库,禁止对数据库的直接操作。对已经连接的 IP 网段进行规范化、统一化的管理,每季度进行权限复核操作,对系统所属 IP、用户进行权限梳理工作。对员工进行安全培训,增强员工的系统安全观念,做到细心操作。确认访问数据库的主机是否为已知用户,使用专门进行维护用的主机与数据库进行连接,禁止使用公用 dblink 对数据库直接操作。同时,审计 SYSDBA 的操作行为,对重要业务表的查询等行为全部进行审计,以便及时发现和追踪安全问题。
(五)备份安全
建立完善的备份机制是确保数据库安全的重要措施。对于关键业务的系统,可以搭建 NBU、DP、DSG 等备份管理软件,针对业务情况、系统压力、带库资源等创建合适的备份策略。例如,本单位都是在闲时每周做一次全备,一天一个增备,且操作系统有 crontab 或者是自带磁带备份主要目录。对于关键业务系统还可以使用当前主流容灾软件技术,如 Oracle Goldengate、DG、Quest Shareplex 等。在业务高峰期,比如系统账期业务较忙,CPU idle 每天 1% 或者 0% 的时候,考虑使用同步复制创建备机,将账期业务迁移至备库,不影响主库的业务,确保数据的安全性和业务的连续性。
三、数据库作用解析
(一)数据存储
数据库能够有序地保存大量数据,为数据的管理和使用提供了便利。以电商平台为例,它可以将用户的个人信息、商品的详细描述以及订单的状态等数据进行分类存储。通过数据库的结构化存储方式,这些数据可以被快速检索和使用,大大提高了电商平台的运营效率。据统计,一些大型电商平台每天需要处理数百万甚至上千万的订单数据,而数据库的高效存储和管理能力为这些平台的稳定运行提供了坚实的基础。
(二)数据查询
数据库提供了强大的查询语言,如 SQL,用户可以通过它进行数据的排序、过滤、聚合等操作,满足各种复杂的查询需求。例如,在企业数据分析中,用户可以使用 SQL 查询语句从庞大的数据库中筛选出特定时间段内的销售数据,并进行汇总和分析。数据库的索引技术进一步提升了查询性能,使得即使在处理大量数据时,查询操作也能在短时间内完成。据研究表明,合理使用索引可以将查询时间缩短数倍甚至数十倍。
(三)数据更新
数据库允许对已有数据进行修改、删除或添加操作。在进行这些操作时,数据库通过事务机制确保数据的可靠性和一致性。事务具有原子性、一致性、隔离性和持久性等特性,保证了数据更新过程中的完整性。例如,在银行系统中,当客户进行转账操作时,数据库会将转账涉及的多个账户的余额更新作为一个事务进行处理,确保整个操作要么全部成功,要么全部失败,不会出现部分成功部分失败的情况。
(四)数据安全
数据安全是数据库的重要作用之一。它包括用户认证、权限控制、数据加密、备份与恢复等多个方面,保护数据不被未授权访问、篡改或破坏。数据库管理系统通常提供用户权限管理功能,可以根据用户角色设置不同的访问权限,确保数据的安全性。同时,数据加密技术可以防止数据在传输过程中被窃取,也可以防止未经授权的用户直接读取数据库中的数据。例如,一些金融机构的数据库采用了高强度的加密算法,对客户的敏感信息进行加密存储,确保数据的安全。
(五)数据共享
多个用户或应用程序可以同时访问和使用数据库中的数据,提高了数据的利用效率。数据库通过并发控制、锁机制等功能,有效管理多个用户对数据的同时访问,避免数据冲突和不一致。在企业环境中,数据库系统可以实现跨部门、跨区域的数据共享,提高工作效率和协作能力。例如,在供应链管理系统中,供应商、制造商、物流公司等多个环节可以通过数据库共享数据,优化供应链流程,降低成本,提高效率。
(六)数据完整性
数据库通过约束条件、触发器、存储过程等机制确保数据的准确性和一致性。约束条件可以限制数据的取值范围、确保数据的唯一性等。触发器可以在特定的数据操作发生时自动执行一些特定的操作,保证数据的完整性。存储过程则可以封装一些复杂的业务逻辑,确保数据的一致性和正确性。例如,在关系数据库中,主键约束可以确保表中每行数据的唯一性,外键约束可以确保数据之间的关联关系正确。
(七)数据冗余减少
通过规范化等技术手段,数据库可以减少数据冗余,提高存储效率和一致性。同文件系统相比,数据库实现了数据共享,避免了用户各自建立应用文件,减少了大量重复数据。例如,在企业管理系统中,通过合理设计数据库表结构,可以避免不同表中存储相同的数据,减少数据冗余,维护了数据的一致性。据统计,采用规范化设计的数据库可以将数据冗余降低 50% 以上。
四、数据库优化之路
(一)架构优化
在高并发场景下,架构优化能够显著提升数据库性能。分布式缓存作为一种常用的优化手段,在应用与数据库之间增加缓存服务,如 Redis 或 Memcache。当接收到查询请求后,先查询缓存,若有数据则直接返回给应用,若无则查询数据库并加载到缓存中,大大减少了对数据库的访问次数。例如,在一些高流量的电商平台中,引入分布式缓存后,数据库的访问压力降低了 70% 左右。
读写分离也是常见的优化方式,一主多从,读写分离,主动同步。当应用读多写少,数据库扛不住读压力时,采用读写分离,通过增加从库数量可以线性提升系统读性能。主库提供写服务,从库提供读能力,主从之间通过 binlog 同步数据。在实际应用中,一个拥有大量用户的社交平台,通过读写分离将读性能提升了 5 倍。
分库分表则适用于数据量大的场景。当单库容量成为性能瓶颈后,采用水平切分,可以降低数据库单库容量,提升数据库写性能。在实施水平切分时,需要结合实际业务选取合理的分片键(sharding-key)。比如在金融交易系统中,根据交易日期进行分库分表,提高了数据处理效率。
(二)硬件优化
硬件优化对于提升数据库性能至关重要。选择高性能硬盘,如 PCIE 固态硬盘,能极大地提高数据库性能。不同规格的硬盘性能差距很大,PCIE 固态硬盘的性能是普通机械硬盘的几十倍不止。从吞吐率来看,机械硬盘约为 100MB/s ~ 200MB/s,普通固态硬盘为 200MB/s ~ 500MB/s,而 PCIE 固态硬盘可达 900MB/s ~ 3GB/s。在 IOPS 方面,机械硬盘为 100 ~ 200,普通固态硬盘为 30000 ~ 50000,PCIE 固态硬盘则高达数十万。在资金充足且迫切需要提升数据库性能时,更换数据库硬盘是一个有效的举措。
(三)DB 优化
数据库实例参数优化对提升数据库性能起着关键作用。遵循 “日志不能小、缓存足够大、连接要够用” 的口诀。数据库事务提交后需要将事务对数据页的修改刷到磁盘上,以保证数据的持久性。通过先将事务写到日志文件 RedoLog(WAL),将随机写优化成顺序写,加一层缓存结构 Buffer,将单次写优化成顺序写,从而提高数据库性能。日志跟缓存对数据库实例尤其重要,而连接如果不够用,数据库会直接抛出异常,系统无法访问。
(四)SQL 优化
合理使用索引是 SQL 优化的重要手段。索引少了查询慢,索引多了占用空间大且影响性能,需要在查询和 DML 性能之间取得平衡。选择率高(重复值少)且被 where 频繁引用的字段需要建立 B 树索引;一般 join 列需要建立索引;复杂文档类型查询采用全文索引效率更好。复合索引创建时要注意基于非前导列查询的情况。
使用 UNION ALL 替代 UNION,因为 UNION ALL 的执行效率比 UNION 高,UNION 执行时需要排重。避免使用 “select ” 写法,执行 SQL 时优化器需要将 “” 转成具体的列,每次查询都要回表,不能走覆盖索引。JOIN 字段建议建立索引,避免复杂 SQL 语句,提升可阅读性,降低慢查询的概率。可以转换成多个短查询,用业务端处理。避免 “where 1=1” 写法和 “order by rand ()” 类似写法,RAND () 会导致数据列被多次扫描。要想优化 SQL 必须会看执行计划,通过 “explain sql” 可以查看执行计划。
五、数据库选型指南
(一)评估项目需求
- 分析数据类型:首先确定项目需要处理的数据类型,关系型数据库适合结构化数据,如企业的财务报表、员工信息等,以 MySQL 为例,它能够高效地存储和管理这类数据,数据之间的关联清晰,便于进行复杂的查询和事务处理。而 NoSQL 数据库,如 MongoDB,适用于非结构化或半结构化数据,像社交媒体平台上的用户生成内容,包括图片、视频描述等,其灵活的数据存储方式能更好地适应这类数据的多样性。
- 预估数据量和生成速度:准确预估项目现在和未来的数据量以及生成速度至关重要。如果是一个快速增长的电商平台,可能需要一个能够高效处理大量数据的数据库。例如,随着业务的发展,每天可能会产生数十万甚至上百万的订单数据和用户行为数据。对于这种情况,可选择具有高写入性能和可扩展性的数据库,如分布式数据库或支持自动分片的数据库,如 MongoDB。据统计,一些大型电商平台采用 MongoDB 后,能够轻松应对数据量的快速增长,在不影响性能的情况下处理每秒数千次的写入操作。
- 确定并发用户数:明确项目预期的并发用户数或连接数,了解需求在高峰和低峰时期的波动。对于高并发的在线游戏平台,可能需要支持大量并发连接的数据库。例如,某些热门在线游戏在高峰时期可能有数十万的同时在线玩家,这就需要数据库能够快速响应大量的并发请求。通过确定数据库必须支持的最大用户数,可以选择能够满足需求的数据库,如 Redis 等内存数据库,它具有极高的读写性能,能够快速处理大量并发请求,满足游戏平台对低延迟的要求。
- 评估性能和安全需求:识别项目成功所必需的特定性能指标,如响应时间或查询效率。同时考虑安全功能,如加密、访问控制或审计功能。对于金融行业的项目,对数据的安全性要求极高,需要数据库提供强大的加密功能和严格的访问控制。例如,一些银行系统采用具有高级安全功能的数据库,对客户的敏感信息进行加密存储,同时通过严格的访问控制确保只有授权人员能够访问数据。响应时间方面,对于在线交易系统,可能要求查询响应时间在毫秒级别以内,以确保用户体验。
- 考虑集成与迁移需求:考虑与现有系统的集成或数据迁移需求,确保选定的数据库能够满足这些要求,并提供相应的工具和支持。如果项目是对现有系统的升级改造,需要考虑数据库的兼容性和数据迁移的难度。例如,一些企业在从传统的关系型数据库向分布式数据库迁移时,需要选择提供完善的数据迁移工具和支持的数据库,以确保迁移过程的顺利进行。
(二)评估数据库选项
- 列出候选名单:根据项目需求,列出与项目需求相符的潜在数据库候选名单。利用对不同数据库类型、特性和使用情况的了解,确定最合适的选项。例如,如果项目需要处理大量的结构化数据且对事务支持要求高,可以将 MySQL、Oracle 等关系型数据库列入候选名单;如果项目需要处理非结构化数据且对可扩展性要求高,可以将 MongoDB、Cassandra 等 NoSQL 数据库列入候选名单。
- 分析特点和能力:对于每个候选数据库,调查它们的特点和能力,以满足项目需求。分析数据库选型的关键因素,如可扩展性、性能、数据一致性、数据模型、安全性、成本和社区支持。以 PostgreSQL 为例,它具有强大的可扩展性,可以通过插件扩展功能,支持复杂的数据类型如数组、JSON、XML 等,在数据一致性方面表现出色,支持事务的 ACID 特性。同时,PostgreSQL 拥有活跃的社区支持和详细的文档,对于项目的开发和维护提供了有力的保障。
- 考虑权衡和限制:注意任何可能影响项目成功的权衡或限制。例如,某些数据库在性能方面表现出色,但可能在可扩展性方面存在一定的限制;或者某些数据库具有较低的前期成本,但随着时间的推移,可能会产生较高的维护、管理或扩展费用。在评估候选数据库时,需要综合考虑这些因素,找到最适合项目的数据库。
- 了解真实性能:了解候选数据库的真实性能,查阅相关的用户评论、案例研究和专家意见。寻找关于数据库在类似项目或行业中的表现以及其他人经历的挑战或成功的信息。例如,可以通过阅读技术论坛上的用户反馈,了解不同数据库在实际项目中的性能表现和遇到的问题。同时,参考行业内的案例研究,了解数据库在类似项目中的应用情况,为项目的数据库选型提供参考。
(三)性能测试与基准测试
- 创建测试环境:创建一个接近生产环境的测试环境,包括与实际项目中预期使用的相同的硬件、软件和网络配置。这有助于确保性能测试和基准测试能够提供准确且相关的结果。例如,在测试一个企业级应用的数据库性能时,需要模拟实际生产环境中的服务器配置、网络带宽和负载情况,以确保测试结果能够真实反映数据库在实际应用中的性能表现。
- 设计测试场景:设计模拟项目实际工作负载的测试场景,涵盖各种用例,例如读写数据、处理复杂查询以及处理并发用户或连接。通过在模拟真实世界情况下测试数据库,可以更好地评估它们在项目中的性能和适用性。例如,对于一个电商平台的数据库,可以设计测试场景包括用户注册、商品查询、下单交易等典型业务操作,模拟高并发情况下数据库的性能表现。
- 测量性能指标:在测试过程中,测量和比较每个数据库的关键性能指标,如查询效率、读写性能和整体系统响应速度。我们将记录每个测试场景的结果,并利用这些结果为每个候选数据库创建全面的性能概况。例如,使用专业的性能测试工具,测量数据库在不同负载下的查询响应时间、每秒事务处理数(TPS)等指标,通过对比不同数据库在这些指标上的表现,评估它们的性能优劣。
- 分析测试结果:完成性能测试和基准测试后,分析结果以识别任何趋势或模式。我们将寻找特定数据库在哪些方面表现优秀或遇到问题,并考虑这些优势和劣势与项目需求的吻合程度。例如,如果一个数据库在处理复杂查询时表现出色,但在高并发写入时性能下降,而项目对高并发写入的需求较高,那么这个数据库可能就不太适合该项目。需要注意的是,没有数据库是完美的,为了达到最佳整体匹配,可能需要做一些权衡和取舍。
(四)考虑长期影响
- 评估适应能力:在评估各种数据库时,考虑决策的长期影响非常重要。思考项目在未来可能发生的变化,包括数据量增加、用户流量增加以及新增功能或服务的影响。评估这些变化对所选数据库的性能、可扩展性和维护等要求的影响。例如,一个社交网络平台在初期可能数据量和用户流量较小,但随着时间的推移,数据量和用户流量可能会呈指数级增长。在选择数据库时,需要考虑数据库能否在不影响性能的情况下处理迅速增加的大量数据,能否扩展以容纳更多并发用户或连接。
- 考虑成本影响:长期规划的另一个重要方面是数据库选择可能带来的潜在成本影响。有些数据库可能有较低的前期成本,但随着时间的推移,可能会产生较高的维护、管理或扩展费用。应考虑每个候选数据库的总拥有成本,包括现在和未来的费用。例如,一些开源数据库在初期可能成本较低,但在后期可能需要投入更多的人力和资源进行维护和优化,而一些商业数据库可能前期成本较高,但提供了更完善的技术支持和服务,在长期来看可能更具成本效益。
- 审查社区支持稳定性:审查每个数据库的开发者社区和公司支持的稳定性以及未来前景。活跃的社区和可靠的公司支持可以表明数据库的未来更加稳定可靠。这可以让我们相信所选择的解决方案将在项目发展过程中持续获得更新、改进和支持。例如,MySQL 拥有庞大的用户社区和活跃的开发者社区,不断推出新的版本和功能,同时有多家知名的公司提供技术支持,这使得 MySQL 在长期使用中具有较高的稳定性和可靠性。