• 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 statusG; //查看连接情况,是不是两个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 statusG;

    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. 1.索引作用  
    2.    在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。  
    3.   
    4.    例如,有3个未索引的表t1、t2、t3,分别只包含列c1、c2、c3,每个表分别含有1000行数据组成,指为1~1000的数值,查找对应值相等行的查询如下所示。  
    5.   
    6. SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3  
    7.   
    8.    此查询结果应该为1000行,每行包含3个相等的值。在无索引的情况下处理此查询,必须寻找3个表所有的组合,以便得出与WHERE子句相配的那些行。而可能的组合数目为1000×1000×1000(十亿),显然查询将会非常慢。  
    9.   
    10.    如果对每个表进行索引,就能极大地加速查询进程。利用索引的查询处理如下。  
    11.   
    12. 1)从表t1中选择第一行,查看此行所包含的数据。  
    13.   
    14. 2)使用表t2上的索引,直接定位t2中与t1的值匹配的行。类似,利用表t3上的索引,直接定位t3中与来自t1的值匹配的行。  
    15.   
    16. 3)扫描表t1的下一行并重复前面的过程,直到遍历t1中所有的行。  
    17.   
    18.    在此情形下,仍然对表t1执行了一个完全扫描,但能够在表t2和t3上进行索引查找直接取出这些表中的行,比未用索引时要快一百万倍。  
    19.   
    20.    利用索引,MySQL加速了WHERE子句满足条件行的搜索,而在多表连接查询时,在执行连接时加快了与其他表中的行匹配的速度。  
    21.   
    22. 2.  创建索引  
    23. 在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。  
    24.   
    25. 1.ALTER TABLE  
    26. ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。  
    27.   
    28.    
    29.   
    30. ALTER TABLE table_name ADD INDEX index_name (column_list)  
    31.   
    32. ALTER TABLE table_name ADD UNIQUE (column_list)  
    33.   
    34. ALTER TABLE table_name ADD PRIMARY KEY (column_list)  
    35.   
    36.    
    37.   
    38. 其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。  
    39.   
    40. 2.CREATE INDEX  
    41. CREATE INDEX可对表增加普通索引或UNIQUE索引。  
    42.   
    43.    
    44.   
    45. CREATE INDEX index_name ON table_name (column_list)  
    46.   
    47. CREATE UNIQUE INDEX index_name ON table_name (column_list)  
    48.   
    49.    
    50.   
    51. table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。  
    52.   
    53. 3.索引类型  
    54. 在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。  
    55.   
    56. PRIMARY KEY索引和UNIQUE索引非常类似。事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引。  
    57.   
    58. 下面的SQL语句对students表在sid上添加PRIMARY KEY索引。  
    59.   
    60.    
    61.   
    62. ALTER TABLE students ADD PRIMARY KEY (sid)  
    63.   
    64. 4.  删除索引  
    65. 可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。  
    66.   
    67.    
    68.   
    69. DROP INDEX index_name ON talbe_name  
    70.   
    71. ALTER TABLE table_name DROP INDEX index_name  
    72.   
    73. ALTER TABLE table_name DROP PRIMARY KEY  
    74.   
    75.    
    76.   
    77. 其中,前两条语句是等价的,删除掉table_name中的索引index_name。  
    78.   
    79. 3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。  
    80.   
    81. 如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。  
    82.   
    83.   
    84. 5.查看索引  
    85.   
    86. mysql> show index from tblname;  
    87.   
    88. mysql> show keys from tblname;  
    89.   
    90.   · Table  
    91.   
    92.   表的名称。  
    93.   
    94.   · Non_unique  
    95.   
    96.   如果索引不能包括重复词,则为0。如果可以,则为1。  
    97.   
    98.   · Key_name  
    99.   
    100.   索引的名称。  
    101.   
    102.   · Seq_in_index  
    103.   
    104.   索引中的列序列号,从1开始。  
    105.   
    106.   · Column_name  
    107.   
    108.   列名称。  
    109.   
    110.   · Collation  
    111.   
    112.   列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。  
    113.   
    114.   · Cardinality  
    115.   
    116.   索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。  
    117.   
    118.   · Sub_part  
    119.   
    120.   如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。  
    121.   
    122.   · Packed  
    123.   
    124.   指示关键字如何被压缩。如果没有被压缩,则为NULL。  
    125.   
    126.   · Null  
    127.   
    128.   如果列含有NULL,则含有YES。如果没有,则该列含有NO。  
    129.   
    130.   · Index_type  
    131.   
    132.   用过的索引方法(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; 
     
     
  • 相关阅读:
    shell流程控制
    shell编程变量介绍与表达式详解
    shell编程简介
    反向代理与负载均衡
    存储库之mongodb,redis,mysql
    请求库之requests,selenium
    解析库之re、beautifulsoup、pyquery
    爬虫基本原理
    Django 函数和方法的区别
    Django 知识补漏单例模式
  • 原文地址:https://www.cnblogs.com/276815076/p/4140613.html
Copyright © 2020-2023  润新知