数据库的操作,表的操作,很重要,但是我感觉对于数据库的安全才是最重要的,来看看该怎么管理好自己的数据库吧,该注意的地方已经做了注释,希望大家可以好好学习。
在本机设置数据库管理员初始密码
[root@xu mysql]# mysqladmin -hlocalhost -uroot password "123"
修改密码 (要知道之前的密码)
[root@xu mysql]# mysqladmin -hlocalhost -uroot -p password "456"
Enter password:
跳过SQL的验证库进入
vim /etc/my.cnf
1 [mysqld]
2 skip-grant-table
修改数据库管理员的密码
mysql> use mysql;
mysql> select User,Host,password from user; 查看user表
mysql> update mysql.user set Passwrod=passwd("888") where User="root" and Host="localhost"; 修改密码
mysql> flush privileges; 刷新授权 只要手动任何一个表作了一个更改就要刷新授权表
注视掉
1 [mysqld]
2 skip-grant-table
重启服务
默认情况下只允数据库在本机登录的时候有给数据库授权的权限
查看自己的登录权限
mysql> show grants;
查看当前有多少个授权用户 权限多少
数据库名
mysql> show grants for extmail@localhost; ---------- 不对。
----------------------------------------
用户授权 (就在本机直接登录其它的电脑的mysql 用管理员身份)
授权格式
grant 权限列表 on 数据库名 to 用户名@ "客户端地址" >[ identified by "密码" with grant option];
权限列表
类表值用,分割
all 所有的
select ,delect,update(name,age) 可选择的
数据库
*.* 所有的
数据库名.* 这个数据的所有
数据库名.表名
用户名
与系统用户无关 。 是自己在授权是自定义的 mysql.user表里 要有标识性
客户端地址
% 所有主机
1.1.1.1 单个主机
192.168.1.% 某个网段
pc1.uplooking.com
.uplooking.com
---------------------------------------
给所有用户手受所有权限
允许使用数据库服务的root用户从网络中所有主机访问数据库服务器 密码123456 对服务器 上的所有库有完全权限 且有授权的权限
授权之前
mysql> select User,Host,password from user;
授权的表
mysql> grant all on *.* to root@"%" identified by "123456" with grant option;
查看授权的权限
mysql> show grants for root@"%";
----------------------------------------------
设置 只能用webuser 用户登录 网段是192.168.1.%
mysql> grant all on grantdb.* to webuser@"192.168.1.%";
----------------------------------------------
mysql> desc db;
+-----------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | | 库的授权信息
| User | char(16) | NO | PRI | | | 用户的授权信息
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
+-----------------------+---------------+------+-----+---------+-------+
22 rows in set (0.01 sec)
-------------------------------------------
库的授权
mysql> use mysql;
mysql> desc db;
mysql> select Host,User,Db from db;
----------------------------------
%不包括localhost
mysql> create database webdb;
mysql>grant select on webdb.* to user@"%" identified by "123" with grant option;
quit
mysql -hlocalhost -uuser1 -p123 登录不上原因 % 不包括localhost
-------------------------------------------------
匿名用户不输入密码也可以登录
登录
[root@xu ~]# mysql -ua
mysql> select User,Host,password from user;
+------+---------------+-------------------------------------------+
| User | Host | password |
+------+---------------+-------------------------------------------+
| root | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root | xu.qq.com | |
| root | 127.0.0.1 | |
| | localhost | | 这样的不安全 ,随便输入个用户就可以进入不需要密码,匿名用户
| | xu.qq.com | |
| root | % | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zp1 | 192.168.1.111 | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| user | % | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+------+---------------+-------------------------------------------+
删除 空白的用户
mysql> delete from mysql.user where User="";
刷新
mysql> flush privileges;
在重新登录 就不能登录了 更加安全
[root@xu ~]# mysql -ua
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: NO)
--------------------------------------------------
用户权限的撤销 (前提要有这样的授权才行要不他提示没有这种权限)
revoke 权限列表 on 数据库名 from 用户名@ “客户端地址“;
查看有什么权限
mysql> show grants for root@"%";
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION |
------------------------------------
撤销用户登录权限 (但是授权的权限还在)用户也在
mysql> revoke all on *.* from root@"%";
再次查看
mysql> show grants for root@"%";
| GRANT USAGE ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION |
-----------------------------------------------
去掉授权的权限 权限没有了 但是用户还在
mysql> revoke grant option on *.* from root@"%";
查看
| GRANT USAGE ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
-------------------------------------
在删除 这个root用户
这样就真正的把权限和用户删出了。
--------------------------------------------------------------
数据库的备份和恢复
物理备份 cp 或者 tar 缺点是跨平台不太好
逻辑备份 提供的备份命令 进行备份 跨平台性
逻辑备份
[root@xu dbadb]# mysqldump -hip -u用户名 -p密码 数据库名 > 目录名/文件
备份表
数据库名
数据库名 所有的进行备份
数据库名 表名1 表名2 表名3 备份多个表
备份库
-B 数据库名1 数据名2 备份多个选择的数据库
[root@xu /]# mysqldump -uroot -p123 --all-databases >/dbadb/aa 备份所有库
-----------------------------------------------------
顺序执行
[root@xu dbadb]# mkdir /dbadb; mysqldump -hlocalhost -uroot -p123 webdb > /dbadb/aa.sql
----------------------------------------
恢复
[root@xu /]# mysql -hip -u 用户名 -p密码 数据名 < 文件名.sql
-----------------------------------------
增量备份
mysql 日志 ( 错误 , 查询 , binlog日志 , 慢查询日志)
binlog日志 能够记录除查询之外的sql语句
默认binlog 日志 在 /var/lib/mysql/ 下
mysql-bin.0000001 记录mysql语句 (查询的不记录)500兆以后就会新创建一个
mysqld-bin.index 存放binlog文件的分数 只有重启服务的时候才会生成,手动创建index内容不会添加进去
查看binlog文件 时间和节点 来记录的
mysqlbinlog mysql-bin.0000001
------------------------
[root@xu mysql]# vim /etc/my.cnf
1 [mysqld]
2 log-bin
[root@xu mysql]# service mysqld restart
----------------------
指定binlog 名字
[root@xu mysql]# vim /etc/my.cnf
1 [mysqld]
2 log-bin=aa
------------------------
指定路径
[root@xu mysql]# vim /etc/my.cnf
1 [mysqld]
2 log-bin=/aa/wenjian
mkdir /aa
chmodo+w /aa
重启服务
-------------------------
手动创建binlog日志
1 service mysqld restart 最少用的
2 mysql > flush logs;
3 mysql -uroot -p123 -e "flush logs"
4 mysqldump -uroot -p123 --flush-logs db1 > /db.sql
-------------------------------
查看binlog文件
mysqlbinlog mysql-bin.0000001
--------------------
恢复 以节点恢复
[root@xu mysql]# mysqlbinlog aa.0000001 --start-postion=98 --stop-positon=189 在桌面显示
[root@xu mysql]# mysqlbinlog aa.0000001 --start-postion=98 --stop-positon=189 |mysql -uroot -p123
增量备份
------------------------------------------
差异备份
星期1 星期2 星期3 星期4 星期5 星期6 星期日
完全备份数据库 bin bin bin bin bin 完全备份数据库
--------------------------------------------------
以时间恢复
[root@xu mysql]# mysqlbinlog aa.0000001 --start-datetime="2013-03-02 13:53:21" --start-time="2013-03-02 13:53:29"
[root@xu mysql]# mysqlbinlog aa.0000001 --start-datetime="2013-03-02 13:53:21" --start-time="2013-03-02 13:53:29" |mysql -uroot -p123
在时间恢复的时候如果俩个命令在同一个时间点上 恢复的时候结束时间要大于开始时间
批量恢复binlog日志的内容
[root@xu mysql]# mysqlbinlog `cat /binlogdir/aa.index` | mysql -uroot -p123
清除index里的文件
prinyf “” > /binlogdir/aa.index
----------------------------------------------
慢查询日志
log-slow-queries[=/path_to/file_name]
long_query_time=3
记录了执行时间超过 log_query_time 参数值的 sql 语句,慢查询日志可以的有效的帮助我们发现实际应用中 sql 性能问题,
找出执行效率低下的 SQL 语句
--------------------------------------------
错误日志
log-error=/var/log/mysqld.log
记录 mysql 数据库启动关闭信息,以及服务器运行过程中所发生的任何严重的错误信息,通常,当数据库出现问题不能正
常启动,我们应当首先想到的就是查看错误日志
--------------------------------
二进制日志
log-bin=[/path_to/file_name]
bin-log=pp
max_binlog_size=1M
binary log 文件是以二进制格式保存的,我们需要借助 mysqlbinlog 工具进行
----------------------------------------
binlog实现 AB 复制(主从复制)
1保持原始数据一至 从的一定要有主的
2 安全机制都关掉
3 线路问题没问题
主的服务器
#1 删掉之前的库 到原始状态
#2 重启服务
3启动binlog日志
进入mysql
创建一个授权帐号
grant replication slave on *.* to plj@"192.168.1.149" indentified by "123";
编辑文件
[root@xu mysql]# vim /etc/my.cnf
1 [mysqld]
2 log-bin
3 server-id=71
---------------------------------------------
从的配置
重启服务
[root@xu mysql]# service mysqld restart
俩个主机的数据一致
编辑文件
[root@xu mysql]# vim /etc/my.cnf
server-id=149
master-host=192.168.1.71
master-user=plj
master-password=123
[root@xu mysql]# service mysqldd restart
---------------------------
[root@xu mysql]# cd /var/lib/mysql/
db ib_logfile0 mysql relay-log.info
extmail ib_logfile1 mysqld-relay-bin.000002 test
ibdata1 master.info mysqld-relay-bin.index
mysqld-relay-bin.000002 中继日志
mysqld-relay-bin.index 中继日志份数
relay-log.info 中继日志主日志数据库的信息
-------------------------
主数据库查看自己的状态
[root@xu mysql]# show master status\G;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000001 | 956 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
从数据库查看自己的状态
[root@xu mysql]# show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.71
Master_User: plj
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000001
Read_Master_Log_Pos: 956
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 1094
Relay_Master_Log_File: mysqld-bin.000001
Slave_IO_Running: Yes 重启服务以后 他看的是master.info 信息
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 956
Relay_Log_Space: 1094
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)