mysql⾃动化运维_mysql操作及⾃动化运维
备份恢复⼯具:percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm
mysql主从配置命令:
主:
1、编辑主MYSQL 服务器的MySQL配置⽂件myf,在[mysqld]下⾯添加以下参数:
log-bin=mysql-bin //开启MYSQL⼆进制⽇志
server-id=1 //服务器ID不能重复
binlog-do-db=dzx2 //需要做主从备份的数据库名字
expire-logs-days = 7 //只保留7天的⼆进制⽇志,以防磁盘被⽇志占满
2、在 A 服务器添加⼀个⽤于主从复制的帐号:
登陆mysql命令⾏,执⾏
GRANT REPLICATION SLAVE ON *.* TO '帐号'@'从服务器IP' IDENTIFIED BY '密码';
例如:帐号是 rep,密码是 123,IP 是 192.168.1.3,则执⾏代码为
GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.1.3' IDENTIFIED BY '123';
3、重启MySQL ,让配置⽣效
4、登录MySQL命令⾏,例如:mysql -uroot –p
5、在主MySQL服务器上执⾏命令,把数据库设置成只读状态:
FLUSH TABLES WITH READ LOCK;
6、执⾏命令,并且记下file及position的值:
show master status;
8、回到MYSQL命令⾏窗⼝,解封数据库只读状态,执⾏:
UNLOCK TABLES;
9、登录论坛后台,“全局—站点信息”,开放论坛访问
10、将刚才备份出来的数据复制到从库服务器
从:
1.innobackupex --defaults-file=./myf --apply-log  /bak/2009_0929
--defaults-file:默认配置⽂件
/bak/2009_0929备份⽬录
2.停⽌mysql,将备份⽬录mv为mysql data⽬录,启动mysql
3.登录从库的MySQL命令⾏,执⾏:
GRANT REPLICATION SLAVE  ON *.* TO 'replication'@'192.168.%' IDENTIFIED BY 'replication_password';
FLUSH PRIVILEGES;
change master to master_host='192.168.1.2', master_user='rep', master_password='123', master_log_file='file的值', master_log_pos=position的值;
//设置连接信息,file及position的值是之前记录下来,position的值没有单引号,其他的值要单引号
4.执⾏:
start slave; //启动从库连接
5.查看从库状态:
show slave status\G; //查看连接情况,是不是两个YES,两个YES为成功
6.编辑从MYSQL服务器的MySQL配置⽂件myf,在[mysqld]下⾯添加以下参数:
master-host=192.168.1.2 //主库A的IP
master-user=rep //刚才在主库创建的帐号
master-password=123 //密码
mysql状态查看:
GlobalStatus:SHOW /*!50001 GLOBAL */ STATUS;
GlobalVariables:SHOW /*!50001 GLOBAL */ VARIABLES;
SHOW GLOBAL STATUS;
SHOW STATUS;
show slave status\G;
select查询:
⾸先我们建⽴⼀张带有逗号分隔的字符串。CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCHAR(20) NOT NULL,pnum VARCHAR(50) NOT NULL);
然后插⼊带有逗号分隔的测试数据
INSERT INTO test(pname,pnum) VALUES('产品1','1,2,4');
INSERT INTO test(pname,pnum) VALUES('产品2','2,4,7');
INSERT INTO test(pname,pnum) VALUES('产品3','3,4');
INSERT INTO test(pname,pnum) VALUES('产品4','1,7,8,9');
INSERT INTO test(pname,pnum) VALUES('产品5','33,4');
查pnum字段中包含3或者9的记录
mysql> SELECT * FROM test WHERE find_in_set('3',pnum) OR find_in_set('9',pnum);
+----+-------+---------+
| id | pname | pnum    |
+----+-------+---------+
|  3 | 产品3 | 3,4    |
|  4 | 产品4 | 1,7,8,9 |
+----+-------+---------+
2 rows in set (0.0
3 sec)
使⽤正则
mysql> SELECT * FROM test WHERE pnum REGEXP '(3|9)';
+----+-------+---------+
| id | pname | pnum    |
+----+-------+---------+
|  3 | 产品3 | 3,4    |
|  4 | 产品4 | 1,7,8,9 |
|  5 | 产品5 | 33,4    |
+----+-------+---------+
3 rows in set (0.02 sec)
这样会产⽣多条记录,⽐如33也被查出来了,不过MYSQL还可以使⽤正则,挺有意思的find_in_set()函数返回的所在的位置,如果不存在就返回0
mysql> SELECT find_in_set('e','h,e,l,l,o');
+------------------------------+
| find_in_set('e','h,e,l,l,o') |
+------------------------------+
|                            2 |
+------------------------------+
1 row in set (0.00 sec)
还可以⽤来排序,如下;
mysql> SELECT * FROM TEST WHERE id in(4,2,3);
+----+-------+---------+
| id | pname | pnum    |
+----+-------+---------+
|  2 | 产品2 | 2,4,7  |
|  3 | 产品3 | 3,4    |
|  4 | 产品4 | 1,7,8,9 |
+----+-------+---------+
3 rows in set (0.03 sec)
如果想要按照ID为4,2,3这样排序呢?
mysql> SELECT * FROM TEST WHERE id in(4,2,3) ORDER BY find_in_set(id,'4,2,3'); +----+-------+---------+
| id | pname | pnum    |
+----+-------+---------+
|  4 | 产品4 | 1,7,8,9 |
|  2 | 产品2 | 2,4,7  |
|  3 | 产品3 | 3,4    |
+----+-------+---------+
3 rows in set (0.03 sec)
mysql新建⽤户本地⽆法登陆:
出此是⽤mysql,因为root权限过⾼,所以新建⼀⽤户appadmin,权限仅为要⽤到的数据库。创建语句如下:grant
select,insert,update,delete on test.* to appadmin@"%" identified by "password";其中@“%”是可以在任何地址登录。
创建后到mysql.user下查看,有该⽤户。但是使⽤mysql -u appadmin -ppassword 登录,提⽰⽆法登
录:ERROR 1045 (28000): Access denied for user 'appadmin'@'localhost' (using password: YES)
百思不得其解,遂google,其中有⼈说到“mysql.user 表中有另外⼀些记录产⽣了作⽤,最有可能的就是已经有⼀条''@localhost记录,就是⽤户名是空,主机字段是localhost的记录。” 影响了。查看该表果然有。
mysql> select host,user,password from mysql.user;
+-----------+------------------+-------------------------------------------+
| host      | user            | password                                  |
+-----------+------------------+-------------------------------------------+
| localhost | root            | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| mza      | root            | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| 127.0.0.1 | root            | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| localhost |                  |                                          |
| mza      |                  |                                          |
| localhost | debian-sys-maint | *19DF6BF8310D46D681AE072AB73ECEC99C018C19 |
| %        | appadmin        | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+-----------+------------------+-------------------------------------------+
7 rows in set (0.00 sec)
但是删除那些为空(匿名)的⽤户后仍然⽆法登录。(可能是因为没有重启mysql)于是只好耐着性⼦看mysql参考⼿册。发现其中增加⽤户部分有这么⼀段话:
其中两个账户有相同的⽤户名monty和密码some_pass。两个账户均为超级⽤户账户,具有完全的权限可以做任何事情。⼀个账户
('monty'@'localhost')只⽤于从本机连接时。另⼀个账户('monty'@'%')可⽤于从其它主机连接。请注意monty的两个账户必须能从任何主机以monty连接。没有localhost账户,当monty从本机连接时,mysql_install_db创建的localhost的匿名⽤户账户将占先。结果
是,monty将被视为匿名⽤户。原因是匿名⽤户账户的Host列值⽐'monty'@'%'账户更具体,这样在user表排序顺序中排在前⾯。
这段话说的很清楚,因此执⾏ grant select,insert,update,delete on test.* to appadmin@"localhost" identified by "password";
退出后⽤appadmin登录,成功。
mysql索引:
1.索引作⽤
在索引列上,除了上⾯提到的有序查之外,数据库利⽤各种各样的快速定位技术,能够⼤⼤提⾼查询效率。特别是当数据量⾮常⼤,查询涉及多个表时,使⽤索引往往能使查询速度加快成千上万倍。
例如,有3个未索引的表t1、t2、t3,分别只包含列c1、c2、c3,每个表分别含有1000⾏数据组成,指为1~1000的数值,查对应值相等⾏的查询如下所⽰。
SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3
此查询结果应该为1000⾏,每⾏包含3个相等的值。在⽆索引的情况下处理此查询,必须寻3个表所有的组合,以便得出与WHERE⼦句相配的那些⾏。⽽可能的组合数⽬为1000×1000×1000(⼗亿),显然查询将会⾮常慢。
如果对每个表进⾏索引,就能极⼤地加速查询进程。利⽤索引的查询处理如下。
mysql删除重复的数据保留一条(1)从表t1中选择第⼀⾏,查看此⾏所包含的数据。
(2)使⽤表t2上的索引,直接定位t2中与t1的值匹配的⾏。类似,利⽤表t3上的索引,直接定位t3中与来⾃t1的值匹配的⾏。
(3)扫描表t1的下⼀⾏并重复前⾯的过程,直到遍历t1中所有的⾏。
在此情形下,仍然对表t1执⾏了⼀个完全扫描,但能够在表t2和t3上进⾏索引查直接取出这些表中的⾏,⽐未⽤索引时要快⼀百万倍。
利⽤索引,MySQL加速了WHERE⼦句满⾜条件⾏的搜索,⽽在多表连接查询时,在执⾏连接时加快了与其他表中的⾏匹配的速度。
2.  创建索引
在执⾏CREATE TABLE语句时可以创建索引,也可以单独⽤CREATE INDEX或ALTER TABLE来为表增加索引。
1.ALTER TABLE
ALTER TABLE⽤来创建普通索引、UNIQUE索引或PRIMARY KEY索引。
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
其中table_name是要增加索引的表名,column_list指出对哪些列进⾏索引,多列时各列之间⽤逗号分隔。索引名index_name可选,缺省时,MySQL将根据第⼀个索引列赋⼀个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
2.CREATE INDEX
CREATE INDEX可对表增加普通索引或UNIQUE索引。
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能⽤CREATE INDEX语句创建PRIMARY KEY索引。
3.索引类型
在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟⼀性索引,这保证单列不包含重复的值。对于多列惟⼀性索引,保证多个值的组合不重复。
PRIMARY KEY索引和UNIQUE索引⾮常类似。事实上,PRIMARY KEY索引仅是⼀个具有名称PRIMARY的UNIQUE索引。这表⽰⼀个表只能包含⼀个PRIMARY KEY,因为⼀个表中不可能具有两个同名的索引。
下⾯的SQL语句对students表在sid上添加PRIMARY KEY索引。
ALTER TABLE students ADD PRIMARY KEY (sid)
4.  删除索引
可利⽤ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为⼀条语句处理,语法如下。
DROP INDEX index_name ON talbe_name

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。