數據庫的操作,表的操作,很重要,但是我感覺對於數據庫的安全才是最重要的,來看看該怎麼管理好自己的數據庫吧,該注意的地方已經做了註釋,希望大家可以好好學習。
在本機設置數據庫管理員初始密碼
[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)