首页 > 代码库 > Mysql使用总结

Mysql使用总结


1. Sql

1.1.1 插入insert的使用

1.insert ignore into

1.insert ignore into

当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉。例如:

 

INSERT IGNORE INTO books (name) VALUES (‘MySQL Manual‘)


2.on duplicate key update

 

primary或者unique重复时,则执行update语句,如update后为无用语句,如id=id,则同1功能相同,但错误不会被忽略掉。例如,为了实现name重复的数据插入不报错,可使用一下语句:

 

INSERT INTO books (name) VALUES (‘MySQL Manual‘) ON duplicate KEY UPDATE id = id

 

3.insert select where not exist

 

根据select的条件判断是否插入,可以不光通过primary unique来判断,也可通过其它条件。例如:

 

INSERT INTO books (name) SELECT ‘MySQL Manual‘ FROM dual WHERE NOT EXISTS (SELECT id FROM books WHERE id = 1)

 

4.replace into

 

如果存在primary or unique相同的记录,则先删除掉。再插入新记录。

 

REPLACE INTO books SELECT 1, ‘MySQL Manual‘ FROM books

1.1.2 grant使用

 

grant select on testdb.* to teamuser@10.161.204.81 identified by ‘123456!‘;

赋予用户teamuser从服务器10.161.204.81上查询数据库testdb所有表的权限;注意赋予内网时,登录也得用内网ip,mysql -h10.161.204.81 -uteamuser -p‘123456!

所有权限用all,即用all代替select

 

导出数据:

mysql -uroot -p‘123456!‘ testdb -e "select id,name from testarticle where id=\"123456\"" > /home/app/a.txt

导出insert语句

mysqldump -uroot -p‘123456!‘ testdb categorys --default-character-set=utf8 > /home/b.txt

二. 数据库维护

2.1故障处理

2.1.1主从不同步的处理-1062

1)查看slave状态:show slave status\G 

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.100.22.15

                  Master_User: repl_user

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000362

          Read_Master_Log_Pos: 175989792

               Relay_Log_File: relay-bin.000540

                Relay_Log_Pos: 258368116

        Relay_Master_Log_File: mysql-bin.000361

             Slave_IO_Running: Yes

            Slave_SQL_Running: No

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 1062

                   Last_Error: Error ‘Duplicate entry ‘1342170‘ for key ‘PRIMARY‘‘ on query. Default database: ‘usercenter‘. Query: ‘insert into test_charge ……

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 673522500

              Relay_Log_Space: 836682055

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: NULL

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 1062

               Last_SQL_Error: Error ‘Duplicate entry ‘1342170‘ for key ‘PRIMARY‘‘ on query. Default database: ‘usercenter‘. Query: ‘insert into test_charge ……

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 1

 

分析:

技术分享

正常情况Seconds_Behind_Master应该为0

解决方法:

A这种适用于该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况,具体命令:

slave stop;

set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

slave start;

B由此表可知 MySQL Server System Variables, slave_skip_errors 是无法被动态改变的.

要改变 slave_skip_errors 的方法就只有在 MySQL 启动时加:

--slave_skip_errors=all

或者于 /etc/my.cnf 加入:

slave-skip-errors=all # 于 [mysqld] 下面加入此行

再 restart mysql 即可

确认是否忽略所有错误

mysql> show variables like "%slave%";

slave_skip_errors => ALL # 看到 ALL 就代表会忽略掉所有错误讯息

忽略某个错误编号

若只要排除 Duplicate entry (Last_Errno: 1062), 可以单独指定 Error No, 多个写法如下:

--slave-skip-errors=1062,1053

--slave-skip-errors=all

详细可见: Replication Slave Options and Variables

于 my.cnf 设定忽略

vim /etc/my.cnf

slave-skip-errors=1062 # 于 [mysqld] 下面加入此行

 

2)扩展:

技术分享

 

2.1.2主从不同步的处理,errcode:1236

1)查看slave状态:show slave status\G;

Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master‘

解决方法:

A进入mysql server,即mysql -uusername -ppassword

mysql 命令行中运行如下:

set global max_allowed_packet = 2*1024*1024*10

退出mysql命令行,然后重新登录。

show VARIABLES like ‘%max_allowed_packet%‘;

查看下max_allowed_packet是否编辑成功

B可以编辑my.cnf来修改(windowsmy.ini,[mysqld]段或者mysqlserver配置段进行修改。

max_allowed_packet = 20M

如果找不到my.cnf可以通过

mysql --help | grep my.cnf

去寻找my.cnf文件。

有了配置文件,在配置文件中的[mysqld]下边加些常用的配置参数。重启mysql服务器后,该参数即可生效。

2.2 主从设置

2.1.2 从指定位置同步

1)有的时候主从同步有问题了以后,需要从log位置的下一个位置进行同步,相当于跳过那个错误,这时候也可以使用CHANGE MASTER命令来处理,只要找到对应的LOG位置就可以,比如:

slave stop;

CHANGE MASTER TO

MASTER_HOST=‘10.1.1.75‘,MASTER_USER=‘replication‘,MASTER_PASSWORD=‘123456‘,MASTER_LOG_FILE=‘mysql-bin.000006‘, MASTER_LOG_POS=106;

slave start;

 

2.3 备份

2.3.1 逻辑备份

1)备份:

mysqldump -hdb.test.com -uusername -ppassword testdb table1 table2 table3 | gzip > /home/mysql_bak/bakup-`date +%Y-%m-%d`.sql.gz

2)恢复:

gunzip < /home/mysql_bak/bakup-2015-03-14.sql.gz | mysql -uusername -ppassword testdb

 

2.4 启动和停止服务器

2.4.1 启动mysql

1)配置my.cnf文件,然后启动:

./bin/mysqld_safe --user=mysql &

2.4.2 停止mysql

$mysql_dir/bin/mysqladmin -uuser -ppassword shutdown

./bin/mysqladmin  -S /tmp/mysql.sock -uroot -pq1234 shut

2.5优化处理

 

2.6 常用命令使用

2.6.1 常用命令

1.show processlist;
解释:显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看
他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。

2.telnet 123.124.92.80 3306 查看是否有权限

3.查看创建表语句:

show create table tablename;  

例如:  

要查看jos_modules表结构的命令:  

show create table jos_modules;

4.查看一个表的索引:show index from tblname;


本文出自 “宁静致远” 博客,谢绝转载!

Mysql使用总结