mysql 自动化运维_mysql操作及自动化运维

备份恢复工具:percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm

mysql主从配置命令:

主:

1、编辑主MYSQL 服务器的MySQL配置文件my.cnf,在[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;

7、备份需要做主从备份的数据库,用导出成SQL或者直接复制数据库文件方式都可以(参考:http://www.jb51.net/article/25257.htm)

8、回到MYSQL命令行窗口,解封数据库只读状态,执行:

UNLOCK TABLES;

9、登录论坛后台,“全局—站点信息”,开放论坛访问

10、将刚才备份出来的数据复制到从库服务器

从:

1.innobackupex --defaults-file=./my.cnf --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配置文件my.cnf,在[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.03 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(十亿),显然查询将会非常慢。

如果对每个表进行索引,就能极大地加速查询进程。利用索引的查询处理如下。

(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

ALTER TABLE table_name DROP INDEX index_name

ALTER TABLE table_name DROP PRIMARY KEY

其中,前两条语句是等价的,删除掉table_name中的索引index_name。

第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。

如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

5.查看索引

mysql> show index from tblname;

mysql> show keys from tblname;

· Table

表的名称。

· Non_unique

如果索引不能包括重复词,则为0。如果可以,则为1。

· Key_name

索引的名称。

· Seq_in_index

索引中的列序列号,从1开始。

· Column_name

列名称。

· Collation

列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。

· Cardinality

索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。

· Sub_part

如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。

· Packed

指示关键字如何被压缩。如果没有被压缩,则为NULL。

· Null

如果列含有NULL,则含有YES。如果没有,则该列含有NO。

· Index_type

用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。

MySql用户创建、授权以及删除:

The create user command:

mysql> CREATE USER yy IDENTIFIED BY '123';

yy表示你要建立的用户名,后面的123表示密码

上面建立的用户可以在任何地方登陆。

如果要限制在固定地址登陆,比如localhost 登陆:

mysql> CREATE USER yy@localhost IDENTIFIED BY '123';

grant:

mysql> GRANT ALL PRIVILEGES ON *.* TO user;@localhost

grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";

grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";

格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"

修改密码:

mysql> grant   all   privileges   on   pureftpd.*   to   koko@localhost   identified   by   'mimi';

flush:

mysql> flush privileges;

查看用户信息:

mysql> select host,user from mysql.user;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值