mysql多启动与日志调优
mysql 多啟動
mysqld_multi 可以管理多個幀聽不同Unix套接字文件和TCP/IP端口的連接的mysqld? 進程。它可以啟動或停止服務器,或報告它們的當前狀態。
rpm 版默認也支持,源碼版需要在編譯時加上
?
第一步:手動編寫這個多啟動配置文件
# vim /usr/local/mysql/etc/mysqld_multi.cnf
[mysqld_multi]??--多啟動的參數組,不要寫錯
mysqld=/usr/local/mysql/bin/mysqld_safe??--啟動時使用的程序
mysqladmin=/usr/local/mysql/bin/mysqladmin?--管理程序
user=multi_admin???--定義管理用戶名
password=multipass???--管理用戶的密碼
[mysqld00]
port=3300
datadir=/data00
pid-file=/var/run/mysqld/mysql00.pid
socket=/var/run/mysqld/mysql00.socket
general_log
general_log_file=/var/log/mysqld/mysql00.log
log-error=/var/log/mysqld/mysql00-err.log
[mysqld01]
port=3301
datadir=/data01
pid-file=/var/run/mysqld/mysql01.pid
socket=/var/run/mysqld/mysql01.socket
general_log
general_log_file=/var/log/mysqld/mysql01.log
log-error=/var/log/mysqld/mysql01-err.log
[mysqld02]
port=3302
datadir=/data02
pid-file=/var/run/mysqld/mysql02.pid
socket=/var/run/mysqld/mysql02.socket
general_log
general_log_file=/var/log/mysqld/mysql02.log
log-error=/var/log/mysqld/mysql02-err.log
?
第二步:
創建目錄,并修改其權限
# mkdir /data00 /data01? /data02 /var/run/mysqld? /var/log/mysqld
# chown mysql.mysql /data00 /data01 /data02 /var/run/mysqld /var/log/mysqld /usr/local/mysql/etc/mysqld_multi.cnf
第三步:
初始化要管理的多個數據庫
# /usr/local/mysql/bin/mysql_install_db --datadir=/data00/? --user=mysql
# /usr/local/mysql/bin/mysql_install_db --datadir=/data01/? --user=mysql
# /usr/local/mysql/bin/mysql_install_db --datadir=/data02/? --user=mysql
第四步,用mysqld_multi啟動多個數據庫
# /usr/local/mysql/bin/mysqld_multi --config-file=/usr/local/mysql/etc/mysqld_multi.cnf start 0,1,2
也可以使用下面的命令來啟動;--config-file參數將會被--defaults-extra-file參數替代
[root@li ~]# /usr/local/mysql/bin/mysqld_multi --defaults-extra-file=/usr/local/mysql/etc/mysqld_multi.cnf start 0,1,2
?
?
# netstat -ntlup |grep 33
tcp??????? 0????? 0 0.0.0.0:3300??????????????? 0.0.0.0:*?????????????????? LISTEN????? 3855/mysqld????????
tcp??????? 0????? 0 0.0.0.0:3301??????????????? 0.0.0.0:*?????????????????? LISTEN????? 3494/mysqld????????
tcp??????? 0????? 0 0.0.0.0:3302??????????????? 0.0.0.0:*?????????????????? LISTEN????? 3507/mysqld???
報告數據庫狀態用report
# /usr/local/mysql/bin/mysqld_multi --config-file=/usr/local/mysql/etc/mysqld_multi.cnf report 0,1,2
Reporting MySQL servers
MySQL server from group: mysqld00 is running
MySQL server from group: mysqld01 is running
MySQL server from group: mysqld02 is running
分別使用這多個數據的方法:
就是使用mysql連接時,指定不同的socket
# /usr/local/mysql/bin/mysql --socket=/var/run/mysqld/mysql00.socket
# /usr/local/mysql/bin/mysql --socket=/var/run/mysqld/mysql01.socket
# /usr/local/mysql/bin/mysql --socket=/var/run/mysqld/mysql02.socket
?
第五步:
授權關閉數據的權限
# /usr/local/mysql/bin/mysqld_multi --config-file=/usr/local/mysql/etc/mysqld_multi.cnf stop 0,1,2
--使用上面命令stop后發現并不能關閉這多個數據庫,因為每個數據庫還需要對multi_admin用戶進行授權
?
連接第一個數據庫授權
# /usr/local/mysql/bin/mysql --socket=/var/run/mysqld/mysql00.socket
mysql> grant shutdown on *.* to 'multi_admin'@'localhost' identified by 'multipass';
mysql> flush privileges;
--每個數據庫都要重復做一次上面的操作,都要授權
都授權后,可以很靈活的關閉和開啟指定的數據庫
# /usr/local/mysql/bin/mysqld_multi --config-file=/usr/local/mysql/etc/mysqld_multi.cnf stop 0,2
# /usr/local/mysql/bin/mysqld_multi --config-file=/usr/local/mysql/etc/mysqld_multi.cnf report 0,1,2
Reporting MySQL servers
MySQL server from group: mysqld00 is not running
MySQL server from group: mysqld01 is running
MySQL server from group: mysqld02 is not running
-------------------------------------------------------------
上面的程序是沒有服務腳本的,要支持chkconfig,就得手動寫
vim /etc/init.d/mysqld_multi
#!/bin/bash
# chkconfig: - 86 16
# description: start and stop the mysqld_multi service.
start () {
??????? /usr/local/mysql/bin/mysqld_multi --config-file=/usr/local/mysql/etc/mysqld_multi.cnf start 0,1,2
}
stop () {
??????? /usr/local/mysql/bin/mysqld_multi --config-file=/usr/local/mysql/etc/mysqld_multi.cnf stop 0,1,2
}
case "$1" in
??????? start )
??????????????? start
??????????????? sleep 2
??????????????? echo " ...........................[OK]"
??????? ;;
??????? stop )
??????????????? stop
??????????????? sleep 2
??????????????? echo " ...........................[OK]"
??????? ;;
??????? restart )
??????????????? stop
??????????????? sleep 5
??????????????? start
??????????????? echo ".........................[OK]"
??????? ;;
??????? *? )
??????? echo "USAGE:start|stop|restart"
??????? ;;
esac
# chmod? 755?? /etc/init.d/mysqld_multi
?
?
=============================================================
--------------------------------------------------------------
sandbox?? 沙盒
?
MySQL實例管理器(IM)是通過TCP/IP端口運行的后臺程序,用來監視和管理MySQL數據庫服務器實例。MySQL實例管理器 適合Unix-類操作系統和Windows。
rpm 版默認也支持,源碼版需要在編譯時加上--withmysqlmanager?
# /usr/local/mysql/libexec/mysqlmanager ?--啟動程序
第一步:
手動編寫配置文件
# vim /usr/local/mysql/etc/mysqlmanager.cnf
[manager]
default-mysqld-path=/usr/local/mysql/libexec/mysqld
socket=/var/run/mysqld/manager.socket
pid-file=/var/run/mysqld/manager.pid
password-file=/usr/local/mysql/etc/my.passwd?--定義密碼文件
monitoring-interval=2??--監控時間間隔
port=1999???--管理端口
bind-address=2.2.2.10?--管理IP
[mysqld03]
port=3303
datadir=/data03
socket=/var/run/mysqld/mysql03.socket
pid-file=/var/run/mysqld/mysql03.pid
general_log
general_log_file=/var/log/mysqld/mysql03.log
log-err=/var/log/mysqld/mysql03-err.log
user=mysql??--這一句不加啟動會報錯
[mysqld04]
port=3304
datadir=/data04
socket=/var/run/mysqld/mysql04.socket
pid-file=/var/run/mysqld/mysql04.pid
general_log
general_log_file=/var/log/mysqld/mysql04.log
log-err=/var/log/mysqld/mysql04-err.log
user=mysql
[mysqld05]
port=3305
datadir=/data05
socket=/var/run/mysqld/mysql05.socket
pid-file=/var/run/mysqld/mysql05.pid
general_log
general_log_file=/var/log/mysqld/mysql05.log
log-err=/var/log/mysqld/mysql05-err.log
user=mysql
第二步:
創建相關目錄,修改權限
# mkdir /data03 /data04 /data05 /var/log/mysqld /var/run/mysqld/
# chown mysql.mysql /data03 /data04 /data05 /var/log/mysqld /var/run/mysqld/ /usr/local/mysql/etc/mysqlmanager.cnf
第三步:
初始化數據庫
# /usr/local/mysql/bin/mysql_install_db --datadir=/data03 --user=mysql
# /usr/local/mysql/bin/mysql_install_db --datadir=/data04 --user=mysql
# /usr/local/mysql/bin/mysql_install_db --datadir=/data05 --user=mysql
?
第四步:創建密碼文件
# /usr/local/mysql/libexec/mysqlmanager --passwd >> /usr/local/mysql/etc/my.passwd
# cat /usr/local/mysql/etc/my.passwd
li:*23AE809DDACAF96AF0FD78ED04B6A265E05AA257
--因為mysql5.1.x版本上面的mysqlmanager程序有BUG,不能生成,所以就用rpm版mysqlmanager程序來替代生成
# /usr/libexec/mysqlmanager --passwd > /usr/local/mysql/etc/my.passwd
Creating record for new user.
Enter user name: li
Enter password:
Re-type password:
第五步:啟動數據庫
# /usr/local/mysql/libexec/mysqlmanager --defaults-file=/usr/local/mysql/etc/mysqlmanager.cnf &
第六步:通過管理IP地址登錄
# /usr/local/mysql/bin/mysql -h 2.2.2.10 -P 1999 -u li -p123
mysql> show instances;
mysql> show instance status mysqld03;
mysql> stop instance? mysqld03;
mysql> start instance? mysqld03;
mysql> show instance options mysqld03;
mysql> show mysqld1 log files;
?
================================================================
?
從一個外部表把數據裝載到數據庫的表內??--oracle里有SQL_LOADER這種工具?
兩個方法:
mysql> load data local infile ....???? --編譯時要加上--enable-local-infile參數
# mysqlimport??
它就是一個load data local infile的一個功能的打包實現
?
mysql> create table emp (ename varchar(10),sex char(1),hiredate date,sal int(4));
mysql> desc emp;
+----------+-------------+------+-----+---------+-------+
| Field??? | Type??????? | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| ename??? | varchar(10) | YES? |???? | NULL??? |?????? |
| sex????? | char(1)???? | YES? |???? | NULL??? |?????? |
| hiredate | date??????? | YES? |???? | NULL??? |?????? |
| sal????? | int(4)????? | YES? |???? | NULL??? |?????? |
在/tmp下建立一個文件emp.txt,內容如下,都是用制表符(使用tab鍵)隔開
zhangsan??????? m?????? 2005-10-03????? 5000
lisi??? m?????? 2004-04-03????? 6000
wangwu? f?????? 2003-06-04????? 8000
maliu?? m?????? 2006-06-06????? 5500
小強??? m?????? 2008-08-06????? 4500
小泉工中一狼??? m?????? 2009-01-03????? 3000
?
導入方法
第一種:
/usr/local/mysql/bin/mysqlimport?source?/tmp/emp.txt?-p123
--文件和表名保持一致
?
第二種:
mysql> use source;
mysql> load data local infile '/tmp/emp.txt' into table emp;
?
例:把/etc/passwd表給導入到數據庫
--注意:此功能安全性方面不太強,有些情況下需要禁用它
例:我只有一個phpwind論壇的用戶,卻可以把系統里的敏感信息如/etc/passwd給裝載到數據庫內來查看
[root@li ~]# /usr/local/mysql/bin/mysql -u phpwind -p123
mysql> use phpwind??--phpwind僅對此庫是有所有權限的?
mysql> create table password (
??? -> username varchar(30),
??? -> password char(1),
??? -> uid int(5),
??? -> gid int(5),
??? -> comment varchar(50),
??? -> homedir varchar(30),
??? -> shell varchar(20));
mysql> desc password;
+----------+-------------+------+-----+---------+-------+
| Field??? | Type??????? | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(30) | YES? |???? | NULL??? |?????? |
| password | char(1)???? | YES? |???? | NULL??? |?????? |
| uid????? | int(5)????? | YES? |???? | NULL??? |?????? |
| gid????? | int(5)????? | YES? |???? | NULL??? |?????? |
| comment? | varchar(50) | YES? |???? | NULL??? |?????? |
| homedir? | varchar(30) | YES? |???? | NULL??? |?????? |
| shell??? | varchar(20) | YES? |???? | NULL??? |?????? |
+----------+-------------+------+-----+---------+-------+
mysql> load data local infile '/etc/passwd' into table password fields terminated by ':' lines terminated by '\n' ;? --可以把/etc/passwd給裝到數據庫進行查看
\n 代表linux系統回車鍵的行結束符號
windows默認為\r\n
可以使用下面的命令互相轉換
dos2unix
unix2dos
?
練習:
如何使用mysqlimport導/etc/passwd到mysql中的ccc.password表
?
[root@li ~]# cp /etc/passwd /etc/password
[root@li ~]# /usr/local/mysql/bin/mysqlimport -p123 phpwind? --fields-terminated-by=":" --lines-terminated-by="\n" /etc/password
phpwind.password: Records: 66? Deleted: 0? Skipped: 0? Warnings: 0
?
?
============================================================
實現用戶登錄,自動執行腳本,把登錄的用戶名,登錄時間等信息插入到數據庫
規劃一個表,用于存放相關信息
mysql> create table login (
??? -> id int not null auto_increment primary key,
??? -> user varchar(30),
??? -> date date,
??? -> time time,
??? -> source_ip varchar(20));
not null? 非空約束
auto_increment?? 自增列
primary key? 主鍵
?
vim /tmp/login.sh
#!/bin/bash
logintty=`ps |grep bash |awk '{print $2}'`
username=`whoami`
source_ip=`who |grep $logintty |awk '{print $NF}'`
/usr/local/mysql/bin/mysql -u root -p123 << EOF
insert into source.login(user,date,time,source_ip) values ("$username",current_date(),current_time(),"$source_ip")
EOF
寫完腳本后
在/etc/profile最后寫上一句
sh /tmp/login.sh
?
------------------------------------------------------------------
把/share/soft/access.log??? 日志整理后插入到數據庫
date?? time???? IP?????? 網址
?
# head /share/soft/access.log |awk ' {if ($7 ~ "http://") print strftime ("%Y-%m-%d %H:%M:%S",$1),$3,$7}'
2008-09-26 23:07:36 192.168.20.171 http://www.google.com/
2008-09-26 23:07:38 192.168.20.171 http://www.google.com/
2008-09-26 23:07:39 192.168.20.171 http://www.google.com/
2008-09-26 23:07:40 192.168.20.171 http://www.google.com/
2008-09-26 23:07:42 192.168.20.171 http://grbc.pw08.iciba.com/dict/dict.php?
2008-09-26 23:07:45 192.168.20.171 http://www.pconline.com.cn/
# cat /share/soft/access.log |awk ' {if ($7 ~ "http://") print strftime ("%Y-%m-%d %H:%M:%S",$1),$3,$7}' > /access.txt
?
mysql> create table squid_log (
??? -> id int not null auto_increment primary key,
??? -> date date,
??? -> time time,
??? -> ip varchar(20),
??? -> url varchar(1000));
mysql> desc squid_log;
+-------+---------------+------+-----+---------+----------------+
| Field | Type????????? | Null | Key | Default | Extra????????? |
+-------+---------------+------+-----+---------+----------------+
| id??? | int(11)?????? | NO?? | PRI | NULL??? | auto_increment |
| date? | date????????? | YES? |???? | NULL??? |??????????????? |
| time? | time????????? | YES? |???? | NULL??? |??????????????? |
| ip??? | varchar(20)?? | YES? |???? | NULL??? |??????????????? |
| url?? | varchar(1000) | YES? |???? | NULL??? |??????????????? |
+-------+---------------+------+-----+---------+----------------+
mysql> load data local infile '/access.txt' into table squid_log fields terminated by ' ' lines terminated by '\n'(date,time,ip,url);
Query OK, 2466836 rows affected, 15 warnings (35.15 sec)
Records: 2466836? Deleted: 0? Skipped: 0? Warnings: 15
?
===============================================================
慢查詢日志
用來記錄執行時間比較長的語句,方便DBA定位數據庫性能問題
mysql> show variables like '%slow%';
+---------------------+---------------------------------+
| Variable_name?????? | Value?????????????????????????? |
+---------------------+---------------------------------+
| log_slow_queries??? | OFF???????????????????????????? |
| slow_launch_time??? | 2?????????????????????????????? |
| slow_query_log????? | OFF???????????????????????????? |
| slow_query_log_file | /var/run/mysqld/mysql5-slow.log |
+---------------------+---------------------------------+
mysql> show variables like '%long%';
+-----------------+-----------+
| Variable_name?? | Value???? |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
--下面我設置參數把慢查詢日志功能打開,并且設置查詢時間大小1秒的就記錄
mysql> set global slow_query_log=on;
mysql> set long_query_time=1;
--上面的設置是馬上生效,但重啟不生效。所以要重啟也生效,把參數加到配置文件里
?
# vim /usr/local/mysql/etc/my.cnf
[mysqld]
log_slow_queries=/var/log/mysqld/mysql5-slowquery.log?--打開慢查詢日志功能,并定義路徑
long_query_time=1?--定義查詢時間大于1秒的就記錄到慢查詢日志,小于1秒的不記錄,默認為10秒,可以使用show variables like '%long%';查看
--重啟服務
[root@li ~]# /usr/local/mysql/bin/mysqladmin shutdown -p123
[root@li ~]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/etc/my.cnf &
?
mysql> select * from squid_log;
..............
2466836 rows in set (5.60 sec)
[root@li ~]# cat /var/log/mysqld/mysql5-slowquery.log?? --只記錄查詢時間大于1秒的查詢
# Time: 110801 16:02:12 ??--記錄的查詢時間
# User@Host: root[root] @ localhost []?--記錄的查詢用戶
# Query_time: 5.603300? Lock_time: 0.000090 Rows_sent: 2466836? Rows_examined: 2466836??--記錄查詢所消耗時間,鎖定時間,操作的行數
use ccc;
SET timestamp=1312185732;?--設置timestamp,是1970年1月1號0點到現在的秒數
select * from squid_log;?--記錄的語句
-------------------------------------------------
索引
加快查詢速度(select),注意索引根據源表數據改變,所以反而會減慢DML語句的速度
???btree? 二叉樹
?
建立索引的基本原則:
對于經常查詢,少做DML操作的表
對于經常用where限制條件的列
?
mysql> select * from squid_log where url='http://www.itpub.net/medalimgs/y7.gif';
22 rows in set (1.38 sec)?--花了1.38秒
--用explain查看一條語句的執行計劃
mysql> explain select * from squid_log where url='http://www.itpub.net/medalimgs/y7.gif'\G;
*************************** 1. row ***************************
?????????? id: 1
? select_type: SIMPLE
??????? table: squid_log
???????? type: ALL
possible_keys: NULL??--沒有走索引
????????? key: NULL
????? key_len: NULL
????????? ref: NULL
???????? rows: 2466836??--掃描了2466836行
??????? Extra: Using where
?
mysql> select * from squid_log where id='244236';
1 row in set (0.00 sec)?--花的時間非常短
mysql> explain select * from squid_log where id='244236'\G;
*************************** 1. row ***************************
?????????? id: 1
? select_type: SIMPLE
??????? table: squid_log
???????? type: const
possible_keys: PRIMARY??--走了一個叫PRIMARY的索引,因為我在建表時id列用的是primary_key主鍵約束,默認會創建索引
????????? key: PRIMARY
????? key_len: 4
????????? ref: const
???????? rows: 1??--直接通過索引去取行,所以這里為1
??????? Extra:
--通過數據庫的信息表可以查詢到這個索引
mysql> select table_name,column_name,index_name,index_type from information_schema.STATISTICS where table_name='squid_log';
+------------+-------------+------------+------------+
| table_name | column_name | index_name | index_type |
+------------+-------------+------------+------------+
| squid_log? | id????????? | PRIMARY??? | BTREE????? |
+------------+-------------+------------+------------+
1 row in set (0.00 sec)
mysql> create index idx_squid_log_url on squid_log(url);
Query OK, 2466836 rows affected, 2 warnings (11 min 4.37 sec)
Records: 2466836? Duplicates: 0? Warnings: 0
?
mysql> select * from squid_log where url='http://www.itpub.net/medalimgs/y7.gif';
22 rows in set (0.00 sec)? --建完索引,再次查詢上面那條語句,時間非常短了
mysql> explain select * from squid_log where url='http://www.itpub.net/medalimgs/y7.gif'\G;
*************************** 1. row ***************************
?????????? id: 1
? select_type: SIMPLE
??????? table: squid_log
???????? type: ref
possible_keys: idx_squid_log_url??? --走了索引
????????? key: idx_squid_log_url?
????? key_len: 1003
????????? ref: const
???????? rows: 3
??????? Extra: Using where
--物理上去驗證大小,看到.MYI索引文件也很大了
-rw-rw---- 1 mysql mysql 8.5K Aug? 1 16:31 squid_log.frm
-rw-rw---- 1 mysql mysql 198M Aug? 1 16:42 squid_log.MYD
-rw-rw---- 1 mysql mysql? 61M Aug? 1 16:42 squid_log.MYI
?
驗證插入速度的減慢
因為在url列上加了一條索引,把這張表truncate掉。然后再導入200多W行,會發現速度慢很多
?
==========================================================
-----------------------------------------------------
view?? 視圖
視圖是虛擬存在的表
數據獨立性
安全性
簡單性
mysql> create view squid_logview? as select ip,url from squid_log;
mysql> show tables;?--是可以查看得到的
--出于安全性問題,把視圖授權給一個用戶能夠查看
mysql> grant select on source.squid_logview to 'log'@'localhost' identified by '123';
mysql> flush privileges;
# /usr/local/mysql/bin/mysql -u log -p123?--使用這個用戶登錄驗證就OK了
?
轉載于:https://blog.51cto.com/linuxart/843817
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的mysql多启动与日志调优的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 处理一键安装LNMP环境之后,phpin
- 下一篇: 创建表分区的总结