mysql初級運維使用技巧


    整理了一下,工做中用到的最高的關於mysql的一些命令和使用技巧,分享給剛接觸mysql的小夥伴麼。mysql

1      mysql最基礎

1.1     mysql安裝

   建議新人安裝mysql直接使用yum安裝便可,大牛們已經對其優化的差很少了,真正玩牛了再搞源碼安裝:linux

   yum -y install mysql mysql-server mysql-devel

   注意,若是是centos庫和有些國內yum源的mysql版本都比較低,若是想要安裝高版本mysql,須要換源,具體操做以下:sql

         rpm -ivhhttp://rpms.famillecollet.com/enterprise/remi-release-6.rpm
         rpm--import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
         yum--enablerepo=remi update mysql mysql-server mysql-devel

   必定要注意,將mysql服務設置爲開機自啓動:shell

 

         chkconfigmysqld on數據庫

 

1.2     密碼設置與用戶受權

1.2.1     root密碼設置

1.   shell命令行:mysqladmin -uroot -ppassword 'new_password'
2.   mysql命令行:upload mysql.user set password=password("new_passwd")where user="root" and host="localhost";

1.3     帳號受權

1.   帳號受權:grant all privileges on *.* to user_name@'%' identified by '1234';
2.   權限回收:revoke  GRANT ALL PRIVILEGESON *.* from 'user_name'@'%';

這個只屬於新手用的命令,更詳細的會在下文中詳細介紹apache

2      mysql使用技巧

2.1     中文亂碼

1.   首先進入mysql命令行看下mysql使用什麼編碼方式:

                   showvariables like "%char%";

2.   在命令行零時修改mysql編碼方式:

                   SETcharacter_set_client='utf8';
                   SETcharacter_set_connection='utf8';
                   SETcharacter_set_results='utf8';

3.   /etc/my.cnf中修改配置文件:                       

                   [client]
                   default-character-set=utf8
                   [mysql]
                   default-character-set=utf8
 
                   [mysqld]
                   datadir=/var/lib/mysql
                   socket=/var/lib/mysql/mysql.sock
                   user=mysql
                   #Disabling symbolic-links is recommended to prevent assorted security risks
                   symbolic-links=0
 
                   collation-server= utf8_unicode_ci
                   init-connect='SETNAMES utf8'
                   character-set-server= utf8
                   lower_case_table_names=1    #數據庫代表大小寫忽略
 
                   log-bin=mysql-bin
                   binlog-format=mixed
 
                   #修改接收數據包大小
                   max_allowed_packet= 20M
                   #打開慢查詢日誌
                   long_query_time= 1
                   log-queries-not-using-indexes
                   log-slow-admin-statements
                   log-slow-queries= /var/lib/mysql/slow-queries.log

                        

        

2.2          忘記root密碼

1.   首先關閉mysql,而後使用不驗證權限的方式啓動:

                   mysqld_safe--skip-grant-tables &

2.   直接shell中輸入:mysql,進入後對root受權:

              updatemysql.user set password=PASSWORD('root') where User='root';
              flush privileges;

3.   重啓mysql服務

 

2.3          臨時關閉外鍵約束

                   SETFOREIGN_KEY_CHECKS=0;

2.4          清空表裏面的數據

                   truncate table tables_name;

2.5          shell中使用mysql語句

        

mysql-uroot -proot -e 'use qhfax;show tables'

2.6          shell查詢每一個表的語句有多少

#!/bin/sh
 
for i in `mysql -uroot -proot -e 'useqhfax;show tables'`    
do
         COUNT=`mysql-uroot -proot -e "select count(*) from $i"` 
         echo"$i $COUNT"
done

        

        

2.7     mysql重啓失敗-操做

         檢查selinux是否啓動,若是啓動數據再也不mysql權限內沒法建立 windows

2.8          主從同步

主:centos

1.   配置主服務器打開binlog

vi /etc/my.cn
server-id=1 #給服務器起一個獨特的ID 
log-bin=mysql-bin #申明2進制日誌的文件爲mysql-bin.xxx
binlog-format=mixed  #二進制格式  mixed[由系統根據語句決定]/row[2進制記錄磁盤變化]/statement[2進制記錄執行語句]

受權:bash

grant replication client,replication slaveon *.*
  to'repl'@'192.168.85.%' identified by 'repl';
flush privileges;

 

2.   配置從服務器

vi /etc/my.cnf
server-id=2 
log-bin=mysql-bin
binlog-format=mixed
relay-log=mysql-relay #從服務器本身產生日誌


 

 

 

3.   受權從服務器

 

change master to
master_host='192.168.85.111',
master_user='repl',
master_password='repl',
master_log_file='mysql-bin.000001',
master_log_pos=98;
 
start slave;
        
show master status;
show slave status;    
        
reset master;
reset slave;

2.9     mysql權限

2.9.1     受權實例

create temporary tables 建立零時表權限
show view 查看視圖


        

本文實例,運行於 MySQL5.0 及以上版本。服務器

MySQL 賦予用戶權限命令的簡單格式可歸納爲:

grant 權限 on 數據庫對象 to 用戶

 

1.   grant 普通數據用戶,查詢、插入、更新、刪除 數據庫中全部表數據的權利。

grant select on testdb.* to common_user@'%'
grant insert on testdb.* to common_user@'%'
grant update on testdb.* to common_user@'%'
grant delete on testdb.* to common_user@'%'

或者,用一條 MySQL 命令來替代:

grant select, insert, update, delete ontestdb.* to common_user@'%'

 

2.   grant 數據庫開發人員,建立表、索引、視圖、存儲過程、函數。。。等權限。

 

grant 建立、修改、刪除 MySQL 數據表結構權限。

grant create on testdb.* todeveloper@'192.168.0.%';
grant alter on testdb.* to developer@'192.168.0.%';
grant drop  on testdb.* to developer@'192.168.0.%';

 

grant 操做 MySQL 外鍵權限。

grant references on testdb.* todeveloper@'192.168.0.%'

grant 操做 MySQL 臨時表權限。

grant create temporary tables on testdb.*to developer@'192.168.0.%';

 

grant 操做 MySQL 索引權限。

grant index on  testdb.* to developer@'192.168.0.%';

 

grant 操做 MySQL 視圖、查看視圖源代碼 權限。

grant create view on testdb.* todeveloper@'192.168.0.%';
grant show  view on testdb.* to developer@'192.168.0.%';

 

grant 操做 MySQL 存儲過程、函數 權限。

grant create routine on testdb.* to developer@'192.168.0.%';  -- now, can show procedure status
grant alter routine on testdb.* to developer@'192.168.0.%';  -- now, you can drop a procedure
grant execute        on testdb.* to developer@'192.168.0.%';

3.   grant 普通 DBA 管理某個 MySQL 數據庫的權限。

grant all privileges on testdb todba@'localhost'

 

其中,關鍵字 privileges 能夠省略。

 

4.   grant 高級 DBA 管理 MySQL 中全部數據庫的權限。

grant all on *.* to dba@'localhost'

 

5.   MySQL grant 權限,分別能夠做用在多個層次上。

 

6.   grant 做用在整個 MySQL 服務器上:

grant select on *.* to dba@localhost; --dba 能夠查詢 MySQL 中全部數據庫中的表。
grant all   on *.* to dba@localhost; -- dba 能夠管理 MySQL 中的全部數據庫
1)        grant 做用在單個數據庫上:
grant select on testdb.* to dba@localhost;-- dba 能夠查詢 testdb 中的表。
 
2)       grant 做用在單個數據表上:
grant select, insert, update, delete ontestdb.orders to dba@localhost;
 
3)        grant 做用在表中的列上:
grant select(id, se, rank) ontestdb.apache_log to dba@localhost;
 
4)       grant 做用在存儲過程、函數上:
grant execute on procedure testdb.pr_add to'dba'@'localhost'
grant execute on function  testdb.fn_add to 'dba'@'localhost'

7.   查看 MySQL 用戶權限

 

查看當前用戶(本身)權限:
show grants;
 
查看其餘 MySQL 用戶權限:
show grants for dba@localhost;

 

8.   撤銷已經賦予給 MySQL 用戶權限的權限。

 

revoke grant 的語法差很少,只須要把關鍵字to換成 from 便可:

grant all on *.* to   dba@localhost;
revoke all on *.* from dba@localhost;

 

9.   MySQL grantrevoke 用戶權限注意事項

 

1)       1. grant, revoke 用戶權限後,該用戶只有從新鏈接 MySQL 數據庫,權限才能生效。

 

2. 若是想讓受權的用戶,也能夠將這些權限 grant 給其餘用戶,須要選項 grant option

grant select on testdb.* to dba@localhostwith grant option;

這個特性通常用不到。實際中,數據庫權限最好由 DBA 來統一管理。     

        

 

#查看grant添加的用戶:selectuser,host from mysql.user;

#刪除用戶:

mysql> drop user"tongor"@localhost;

        

2.10  mysql存儲過程權限

即時賦予一個用戶,執行存儲過程的權限,普通用戶執行非他本身建立的存儲過程仍是會失敗

execute command denied to user'test_ryd'@'%' for routine 'test_04.generate_serialno'
The user specified as a definer('user_admin'@'%') does not exist

可是提示存儲過程定義中的definer不存在,原來僅僅是鏈接到MySQL服務器的用戶具備執行存儲過程的權限是遠遠不夠的,最終要經過存儲過程定義中指定的definer來執行存儲過程。

 

 

3      mysql排錯

3.1     msyql.proc is wrong

         解決:mysql_upgrade -u root -p

         知識:mysql_upgrade升級受權表

        

        

3.2     ERROR 2006 (HY000) at line1: MySQL server has gone away

         解決:SQL語句過長,建議改語句

         知識:insert執行語句過長形成的

        

 

3.3     Cannot load frommysql.proc. The table is probably corrupted

【錯誤過程】:MySQL從5.1升級至5.5後在調用存儲過程時報出「Cannotload from mysql.proc. The table is probably corrupted。」
【形成緣由】:MySQL升級完成後未對相關數據庫執行升級.
【解決辦法】:在命令行中執行mysql_upgrade-uroot -p 便可~

3.4     mysql max_allowed_packet

         showVARIABLES like '%max_allowed_packet%';
        
         能夠編輯my.cnf來修改(windows下my.ini),在[mysqld]段或者mysql的server配置段進行修改。
    max_allowed_packet = 20M
          
          set global max_allowed_packet = 2*1024*1024*10
          show VARIABLES like '%max_allowed_packet%';

3.5     Mysql Got error 28 fromstorage engine錯誤:磁盤臨時空間不夠致使

 

3.6          cloumn count of mysql.proc

         mysql_upgrade-u root -proot --force

        

3.7          Grant的時候報錯的解決:Accessdenied for user 'root'@'localhost' (using password: YES)

     解決:mysql_upgrade -uroot -proot--force
     知識點:低版本mysql向高版本遷移的時候,存儲過程問題


        

3.8          主從不一樣步

方法一:忽略錯誤後,繼續同步
該方法適用於主從庫數據相差不大,或者要求數據能夠不徹底統一的狀況,數據要求不嚴格的狀況
解決:
stop slave;
#表示跳過一步錯誤,後面的數字可變
set global sql_slave_skip_counter =1;
start slave;
以後再用mysql>show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
ok,如今主從同步狀態正常了。。。
相關文章
相關標籤/搜索