MySQL数据库安全
数据备份
需求
数据丢失的原因:自然灾害,人为破坏,设备故障,程序错误,计算机失败,磁盘失败
应对方案:
物理备份:脱机备份(冷备份),联机备份(热备份);冷备份是在关闭数据库时进行的备份,热备份是数据库处于运行状态,依赖 于数据库的日志文件
逻辑备份:通过软件,逻辑备份
完整备份:完整的备份,每次对数据进行完整的备份
增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份
差异备份:备份那些自上次完全备份后被修改的文件
MySQL dump简介
mysqldump是MySQL自带的逻辑备份工具
备份原理:通过协议连接到MySQL数据库,将需要备份的数据查询出来,将查询的数据转换成对应的insert语句,当需要还原数据时,执 行这些insert语句,即可将对应的数据还原
备份命令
命令格式:
mysqldump [选项] 数据库名 [表名] > 脚本名
mysqldump [选项] --数据库名 [选项 表名] > 脚本名
mysqldump [选项] --all-databases [选项] > 脚本名
选项说明:
实例
备份所有数据库:mysqldump -uroot -p --all-databases > /backup/mysqldump/all.db
备份指定数据库:musqldump -uroot -p test > /backup/mysqldump/test.db
备份指定数据库指定表(多个表以空格间隔):mysqldump -uroot -p mysql db event > /back/mysqldump/table.db
备份指定数据库排除某些表:mysqldump -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > backup/mysqldump/test.db
还原命令
mysqladmin -uroot -p create db_name
mysql -uroot -p db_name < /backup/mysqldump/db_name.db
source方法(将SQL数据导入数据库)
mysql > use 数据库名;
mysql > source 文件路径;
注:在导入备份数据库前,db_name如果没有,是需要创建的;而且与db_name.db中的数据库名称一样才能导入
配置文件优化(vi /etc/my.cnf)
sort_buffer_size = 2M --线程占用内存,一个线程占用2M,不能设置太大,不然数据并发高容易崩溃
query_cache_size = 64 --数据库的缓存建议设置小一点,因为数据库不适合大量大缓存
query_cache_nim_res_unit = 2k --设置小资源能够存入数据库缓存
tmp_table_size = 256M --临时表,会占用磁盘空间
long_query_time = 2 --慢查询时间,单位是秒,一般数据库慢查询不会超过2s
log-slow-queries = /var/log/mysql-slow-log.log --指定慢查询日志文件位置
log-error = /var/log/mysql-error.log --定义错误日志
expire_logs_days = 7 --自动删除7天的logs
key_buffer_size = 2048M --索引数据内存大小,建议使用大一点
skip-name-resolve --加这个参数防止数据库经常出现没有权限的报错
忘记数据库密码操作
步骤
a、停止服务:systemctl stop mysqld
b、跳过密码直接登录:mysqld_safe --skip-grant-table&
c、登录:mysql
d、修改密码:mysql> update mysql.user set password=password("1234") where user=‘root‘;
e、更新数据库:mysql> flush privileger;
f、kill进程mysqld:killall mysqld
g、重启:systemctl restart mysqld
h、验证:mysql -uroot -p1234
有关内置库的说明:
库mysql:表user存储的是用户名和密码信息。(在MySQL5.7中password字段已从mysql.user表中删除,新的字段名是authenticalion_string)
补充有关information_schema库中的内容
1.schemata:保存了当前服务器上所有的数据库名,字段
mysql> desc schemata;
查看其中的字段名:
mysql> select schema_name from schemata;
2.tables:保存了所有的库名(字段table_schema),和所有的表名(字段table_schema)
mysql> desc tables;
mysql> select table_schema,table_name from tables;
3.clolumns:保存了所有的库名(字段table_schema),保存了所有的表名(字段table_name),保存了所有的字段名(字段column_name)
mysql> desc columns;
mysql> select column_name from information_schema.columns where table_schema=‘school‘ and table_name=‘DEPT‘;
4.SQL注入流程:库—>表—>字段
二进制日志与慢查询日志
二进制日志
二进制日志默认是关闭的;二进制日志是记录数据的更改,目的是在恢复数据时能够最大程度的恢复数据库
慢查询日志
慢查询日志是记录所有执行时间超过long_time设置时间的SQL语句
APP、应用、web反应慢?
1.SQL语句本身逻辑问题
2.索引失效,重建索引(查找是否使用索引:explain select * from 数据库名)
3.服务器被攻击
主从复制
修改服时间同步环境,在主节点上搭建时间同步服务器
1.安装NTP服务器
yum -y install ntp
2.配置NTP服务器
vi /etc/ntp.conf
server 127.127.1.0 //设置本地供给源
fudge 127.127.1.0 stratum 8 //设置时区为+08区
systemctl restart ntpd //重启ntp服务器
systemctl enable ntpd //设置开机自启
在从节点服务器上进行时间同步
yum -y install ntpdate
ntpdate 主服务器IP地址
修改主服务器
打开主服务器上二进制日志
vi /etc/my.cnf
server_id = 11
log_bin = master-bin(修改)
log-slave-updates = true(增加)
重启服务器
systemctl restart mysqld
进入mysql数据库,给服务器授权
mysql -uroot -p
grant replication slave on *.* to ‘myslave‘@‘192.168.1.%‘ identified by ‘123456‘;
flush privileges;
show master status\G;
修改从服务器
打开从服务器的二进制日志
vi /etc/my.cnf
server-id = 22(修改)
relay-log = relay-log-bin(增加)
relay-log-index = slave-relay-bin.index(增加)
重启mysqld
systemctl restart mysqld
数据库连接主服务器
change master to master_host = ‘192.168.1.10‘,master_user = ‘myslave,master password = ‘123456‘,master logfile = ‘master-bin.000003‘,master_log_pos = 615;
启动从服务器同步
start slave;
stop slave;
查看slave状态确保I/O线程和sql线程为yes
show slave status\G;
备注:解决UUID重复问题方法
mv /usr/local/mysql/data/auto.cnf /usr/local/mysql/data/auto.cnf.bak