面试题答案
一键面试备份存储策略
1. 数据一致性备份
- 使用逻辑备份工具:在MySQL高可用集群环境下,对于数据一致性备份可选用
mysqldump
工具。在执行备份操作前,可通过设置--single - transaction
参数,它会在事务级别保证备份数据的一致性。此参数会开启一个事务,在事务内读取数据,确保在备份过程中,数据库数据的一致性状态被“冻结”,从而获取到一致性数据。例如:mysqldump -u [用户名] -p [密码] --single - transaction [数据库名] > backup.sql
。 - 基于集群特性的备份:对于Galera Cluster,可在其中一个节点上执行备份操作,由于Galera Cluster的同步复制机制,各节点数据是一致的。在InnoDB Cluster中,可选择从一个只读的副本节点进行备份,这样既不影响主节点的写入性能,又能获取到一致性数据。例如,在InnoDB Cluster只读副本节点上,通过
mysqlpump
工具进行备份,mysqlpump -u [用户名] -p [密码] --exclude - schema=mysql --exclude - schema=performance_schema --exclude - schema=sys --exclude - schema=information_schema [数据库名] > backup.sql
,此命令会排除系统数据库,只备份用户数据库。
2. 对集群性能影响最小化
- 选择合适的备份时间:分析业务流量规律,选择在业务低峰期进行备份操作。例如,大多数互联网应用在凌晨2 - 5点业务流量较低,可在此时间段内安排备份任务。
- 增量备份:采用增量备份策略,首次进行全量备份后,后续只备份自上次备份以来发生变化的数据。在MySQL中,可以利用二进制日志(binlog)实现增量备份。首先通过
SHOW MASTER STATUS
获取当前二进制日志文件名和位置,然后在后续增量备份时,使用--start - position
参数指定上次备份结束的位置进行备份。如mysqlbinlog --start - position=[位置] [二进制日志文件名] > incremental_backup.sql
。这样可以减少备份数据量,降低对集群性能的影响。 - 限制备份带宽:在执行备份操作时,可以使用
ionice
和nice
命令来限制备份进程的I/O和CPU资源占用。例如,ionice -c 3 nice -n 19 mysqldump -u [用户名] -p [密码] [数据库名] > backup.sql
,ionice -c 3
将I/O调度类设置为空闲,nice -n 19
将进程优先级设置为最低,从而减少备份操作对其他业务进程的影响。
安全性强化措施
1. 针对SQL注入攻击
- 输入验证:在应用程序端对用户输入进行严格验证,只允许符合预期格式的数据进入数据库查询。例如,使用正则表达式对输入的字符串进行匹配,确保其符合特定规则。在PHP中,可以使用
preg_match
函数进行验证,如if (!preg_match('/^[a-zA - Z0 - 9]+$/', $input)) { die('非法输入'); }
。 - 使用参数化查询:在编写SQL语句时,使用参数化查询。在Java中,使用JDBC的
PreparedStatement
类,例如:
String sql = "SELECT * FROM users WHERE username =? AND password =?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
这样可以防止恶意用户通过构造特殊字符来篡改SQL语句结构。
- 设置合适的数据库用户权限:为应用程序使用的数据库用户授予最小权限,只允许执行必要的操作。例如,对于一个只读应用,授予该用户
SELECT
权限即可,避免授予过多的权限如CREATE
、DELETE
等,降低SQL注入攻击造成严重破坏的风险。
2. 针对数据窃取攻击
- 数据加密:对敏感数据在存储和传输过程中进行加密。在MySQL中,可以使用
CREATE TABLE
语句中的ENCRYPTION
选项对表进行加密存储,例如CREATE TABLE sensitive_data (id INT, data VARCHAR(255)) ENGINE=InnoDB ENCRYPTION='Y';
。在数据传输过程中,可使用SSL/TLS协议对连接进行加密,在MySQL配置文件(如my.cnf
)中添加ssl - ca=[CA证书路径]
、ssl - cert=[证书路径]
、ssl - key=[私钥路径]
等配置,确保客户端与数据库之间的数据传输安全。 - 访问控制:实施严格的访问控制策略,只有授权的用户和应用程序才能访问数据库。除了数据库用户权限控制外,还可以在网络层面设置防火墙,只允许特定的IP地址或IP段访问数据库服务器。例如,在Linux系统中,使用
iptables
命令配置防火墙规则,iptables -A INPUT -p tcp --dport 3306 -s [允许的IP地址] -j ACCEPT
,只允许指定IP地址访问MySQL服务端口。 - 审计与监控:开启MySQL的审计日志功能,记录所有数据库操作。在
my.cnf
文件中添加audit_log=ON
启用审计日志。通过审计日志可以及时发现异常的数据库访问行为,如频繁的大规模数据查询等可能的数据窃取行为,并及时采取措施进行处理。同时,使用监控工具如Prometheus
+Grafana
对数据库的关键指标(如查询次数、流量等)进行实时监控,一旦发现异常指标变化,及时发出警报。