mysql


文件系统管理数据存在的问题

1、数据冗余性和不一致性

2、数据访问

3、数据相对独立

4、完整性和原子性问题

5、并发访问异常

6、安全性问题


数据库:指的是以一定方式储存在一起,能为多个用户共享,具有尽可能小的冗余度的特点,是与应用程序彼此独立的数据集合。

1、实现数据共享

2、减少数据的冗余度

3、数据实现集中控制

4、数据的一致性

5、故障恢复


关系式数据库

DBMS 数据库管理系统

软件、管理数据库


层次模型  网状模型  关系模型


RDBMS 关系数据库管理系统  DBMS = RDBMS


E-R模型


ERM概念 实体关系建模

          实体:实体就是指的数据对象

          联系:联系代表一个或多个实体之间的联系

          属性:实体的某一特性

超市: 超市名  超市地址

商品: 商品名称 商品价格

员工: 性名 性别 编号

销售: 商品 超市 销售量


创建数据库  修改数据库


SQL语句  结构化查询语言

大型共享数据库数据的关系模型

SQL发展历史

System R   DB2  SQL-SERVER  T-SQL 

ORACLE  PL/SQL     ANSI

SQL 分类

数据操作语言DML:用于操作数据库对象中所包含的数据。

例如|:INSERT,  UPDATE,  DELETE语句。


数据定义语言DDL: 用于定义和管理数据对象,包括数据库,数据表等。

例如:CREATE,  DROP删除  ALTER修改数据表等。


数据查询语言DQL:用于查询数据库对象中所包含的数据。

例如: SELECT


数据控制语言DCL:是用来管理数据库的语言,包括管理权限及数据更改。

例如: GRANT授权  REVOKE删除权限


关系结构


文件系统的逻辑关系

上层:文件系统中的数据,体现成文件的形式。

底层:数据存在硬盘的数据块

中间层:文件系统


数据库的逻辑关系

上层:数据表

底层:文件

中间层:能够将文件逻辑成表的组件,存储引擎


存储引擎

MyISAM 特点:最常见,查询速度较快  缺点:不支持事务,行级锁和外键约束功能

事务:一段SQL语句的批处理,具有原子性(要么全部SQL语句都执行成功,要么全部SQL语句都执行不成功)

  行级锁:InnoDB数据不能修改行级锁定的数据,其它的可以修改

  表级锁:MyISAM 直接锁定整张表,要么都能修,要么都不能修改

  页级锁:DBD 锁定一张表格的相邻的几组数据

约束:

  域约束:某个单元格填写某种类型的数据

  外建约束:约束数据正确性


InnoDB 

Memory基本内存的引擎,速度快 缺点:不能永远保存数据

数据库

1、只支持一种存储引擎 ORACLE

2、支持多种存储引擎  MYSQL



数据库结构分为两大类


存储管理器

       权限及完整性管理器

       事务管理器

       文件管理器

       缓冲区管理器


查询管理器

        DDL DML 

        查询执行引擎


数据库工作模式

单进程多线程模式

守护线程

应用线程

 

优化数据库性能

缓存

线程重用

硬件

          SMP 对称多处理器结构

MYSQL 版本

社区版 企业版 集群版


[root@localhost ~]# mysql -u root -p123456 -h localhost -P 3306    #登陆mysql


mysql>create user you2@'localhost' identified by '123';  #设置普通本地用户 you 123456


mysql>create user you@’%’ identified by ‘123456’ #设置普通用户 you 123456  %代表任意远端地址登陆,在本地没办法登陆


mysql>set password=password('123456');    #更改root管理员的密码123456


mysql>set password for 'you'@'localhost'=password('123');    更改普通用户密码为123


mysql>drop user ppp@'%';  删除用户

mysql>drop user root@'localhost';


mysql>select user , host from mysql . user; 查看mysql的用户信息



单实例

如何找回密码:

1、停止数据库

2、修改主配件文件 vim /etc/my.cnf 加入 (skip-grant-tables 跳过授权表)

3、mysql> update mysql.user set password=password('123') where user='root'; 修改密码

4、exit 数据库

5、删除授权操作skip-grant-tables

6、service mysqld restart 重启并用新密码测试登录

登陆 mysql -uroot -p


多实例修改密码

1、停止数据库

2、修改主配件文件 vim /etc/my.cnf 加入 (skip-grant-tables 跳过授权表)

3、mysql> update mysql.user set password=password('123') where user='root'; 修改密码

4、exit 数据库

5、删除授权操作skip-grant-tables

6、service mysqld restart 重启并用新密码测试登录

登陆mysql -u root -p -S /data/3306/mysql.sock


mysql> select user,host from mysql.user; 查看数据库用户

mysql> show databases;   #查看数据库

mysql> select databases(); #查看是否进入某一个数据库

mysql> use mysql;      #切换数据表

mysql> system whoami #切换到linux下

mysql> system ls /

mysql> show tables;   #查看数据表 


使用help查询命令


#创建数据库

mysql> create database you;

Query OK, 1 row affected (0.00 sec)



#显示数据库

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| you                |

| mysql              |

| test               |

+--------------------+

5 rows in set (0.00 sec)


mysql> SHOW create database you;

+----------+----------------------------------------------------------------+

| Database | Create Database                                                |

+----------+----------------------------------------------------------------+

| you      | CREATE DATABASE `you` /*!40100 DEFAULT CHARACTER SET latin1 */ |

+----------+----------------------------------------------------------------+

1 row in set (0.00 sec)


查看数据库字符集

mysql> show create database abc\g;

+----------+----------------------------------------------------------------+

| Database | Create Database                                                |

+----------+----------------------------------------------------------------+

| abc      | CREATE DATABASE `abc` /*!40100 DEFAULT CHARACTER SET latin1 */ |

+----------+----------------------------------------------------------------+

1 row in set (0.00 sec)


创建you_gbk数据库字符集gbk

mysql> CREATE DATABASE `you_gbk`  DEFAULT CHARACTER SET gbk;

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| you                |

| you_gbk            |

+--------------------+

7 rows in set (0.00 sec)



创建you_utf8数据库字符集utf8;

mysql> CREATE DATABASE `you_utf8`  DEFAULT CHARACTER SET utf8;

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| you_gbk            |

| you_utf8           |

+--------------------+

8 rows in set (0.00 sec)


mysql字符集包括字符集和校对规则

字符集是定义mysql字符串存储方式,校对规则定义mysql比较字符串的方式。


删除数据库

mysql> drop database test;

Query OK, 0 rows affected (0.00 sec)


查看数据库用户

mysql> select user,host from mysql.user;

+------+-----------------------+

| user | host                  |

+------+-----------------------+

| root | 127.0.0.1             |

|      | localhost             |

| root | localhost             |

|      | localhost.localdomain |

| root | localhost.localdomain |

+------+-----------------------+

5 rows in set (0.00 sec)


连接数据库

mysql> use mysql


#查看是否进入数据库

mysql> select database(); 

+------------+

| database() |

+------------+

| mysql      |

+------------+

1 row in set (0.00 sec)


#查看数据库用户

mysql> select user();

+----------------+

| user()         |

+----------------+

| root@localhost |

+----------------+

1 row in set (0.00 sec)


查看数据库中的表

mysql> show tables;

+---------------------------+

| Tables_in_mysql           |

+---------------------------+

| columns_priv              |

| db                        |

| event                     |

| func                      |

| general_log               |

| help_category             |

| help_keyword              |

| help_relation             |

| help_topic                |

| host                      |

| ndb_binlog_index          |

| plugin                    |

| proc                      |

| procs_priv                |

| servers                   |

| slow_log                  |

| tables_priv               |

| time_zone                 |

| time_zone_leap_second     |

| time_zone_name            |

| time_zone_transition      |

| time_zone_transition_type |

| user                      |

+---------------------------+

23 rows in set (0.00 sec)


跳出mysql操作linux

mysql> system whoami

root

mysql> system ls /

bin dev   lib  misc opt   sbin     srv  usr

boot etc   lost+found  mnt proc  selinux  sys  var

cgroup home  media  net root  sh       tmp


查看mysql数据库有多少张表

mysql> show tables from mysql;

+---------------------------+

| Tables_in_mysql           |

+---------------------------+

| columns_priv              |

| db                        |

| event                     |

| func                      |

| general_log               |

| help_category             |

| help_keyword              |

| help_relation             |

| help_topic                |

| host                      |

| ndb_binlog_index          |

| plugin                    |

| proc                      |

| procs_priv                |

| servers                   |

| slow_log                  |

| tables_priv               |

| time_zone                 |

| time_zone_leap_second     |

| time_zone_name            |

| time_zone_transition      |

| time_zone_transition_type |

| user                      |

+---------------------------+

23 rows in set (0.00 sec)


创建mysql用户

mysql> create user you@'localhost' identified by '123456';

Query OK, 0 rows affected (0.00 sec)


mysql> select user,host from mysql.user;

+------+-----------------------+

| user | host                  |

+------+-----------------------+

| root | 127.0.0.1             |

|      | localhost             |

| root | localhost             |

| you  | localhost             |

|      | localhost.localdomain |

| root | localhost.localdomain |

+------+-----------------------+

6 rows in set (0.00 sec)


删除mysql用户

mysql> drop user you1@'localhost';

Query OK, 0 rows affected (0.00 sec)


删除用户

delete from mysql.user where user='you';

delete from mysql.user where user='you'and user='root';


用户授权,先创建用户再授权用户

mysql> create user 'xiaoyou'@'localhost' identified by '123456';

mysql> grant all on *.* to 'xiaoyou'@'localhost';

Query OK, 0 rows affected (0.00 sec)


查看用户权限 USAGE只有连接的权限

mysql> show grants for oldboy@localhost\G;

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

Grants for oldboy@localhost: GRANT USAGE ON *.* TO 'oldboy'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'

1 row in set (0.00 sec)


ERROR: 

No query specified


给某个数据库授权

mysql> create user 'youyou'@'localhost' identified by '123456';

Query OK, 0 rows affected (0.00 sec)


mysql> select user,host from mysql.user;

+---------+-----------------------+

| user    | host                  |

+---------+-----------------------+

| root    | 127.0.0.1             |

|         | localhost             |

| root    | localhost             |

| xiaoyou | localhost             |

| youyou  | localhost             |

|         | localhost.localdomain |

| root    | localhost.localdomain |

+---------+-----------------------+

8 rows in set (0.00 sec)


mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| you                |

| you_abc            |

| you_gbk            |

| you_utf8           |

+--------------------+

6 rows in set (0.00 sec)


创建拉丁字符集数据库  mysql默认字符集

mysql> create database data0;

Query OK, 1 row affected (0.00 sec)


linux系统字符集 vim /etc/sysconfig/i18n  LANG="zh CN.UTF-8"


创建utf8字符集数据库

mysql> create database data2 default character set utf8 collate utf8_general_ci;

Query OK, 1 row affected (0.00 sec)


创建gbk字符集数据库

mysql> create database data3 default character set gbk collate gbk_chinese_ci;

Query OK, 1 row affected (0.00 sec)


mysql> create database youyou;

Query OK, 1 row affected (0.00 sec)


mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| you                |

| you_abc            |

| you_gbk            |

| you_utf8           |

| youyou             |

+--------------------+

7 rows in set (0.00 sec)


mysql> use youyou

Database changed

mysql> grant all on youyou.* to youyou@localhost;


直接创建用户和授权

mysql> grant all on youyou.* to etian@localhost identified by '123456';

Query OK, 0 rows affected (0.00 sec)


mysql> grant create,delete,update,insert on aaa.*  to you2@localhost identified by '123456';

Query OK, 0 rows affected (0.00 sec)


mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| abc                |

| anni_bgk           |

| data1              |

| data2              |

| mysql              |

+--------------------+

6 rows in set (0.00 sec)


收回授权

mysql> revoke insert on youyou.* from 'jeffrey'@'localhost';

ERROR 1141 (42000): There is no such grant defined for user 'jeffrey' on host 'localhost'


mysql> revoke insert on youyou.* from 'youyou'@'localhost';

Query OK, 0 rows affected (0.00 sec)

mysql> show grents for ww@localhost\G

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'grents for ww@localhost' at line 1


mysql> show grants for ww@localhost\G;

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

Grants for ww@localhost: GRANT USAGE ON *.* TO 'ww'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'

*************************** 2. row ***************************

Grants for ww@localhost: GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `wwtable`.* TO 'ww'@'localhost'

2 rows in set (0.00 sec)


查看数据库授权表

mysql> desc mysql.user;


主从mysql授权

生产环境主库用户的授权

grant select, insert, update, delete on blog.* to blog@'172.20.100.%' i dentified by '123456';


生产环境从库用户的授权

grant select on blog.* to blog@'10.0.0.%' identified by '123456';


例:

写库

blog  you456 3306 10.0.0.7

读库

blog  you456 3306 10.0.0.8


创建gbk数据库

CREATE DATABASE anni_bgk CHARACTER SET gbk collate gbk_chinese_ci;


建立测试表test

命令: create talbe test (<字段名1><类型1> <字段n><类型n>.....)


mysql数据库类型

1、INT[(M)]型:正常大小整数类型

2、DOUBLE[(M,D)] [ZEROFILL]型,正常大小双精密浮点数字类型

3、DATE 日期型

4、CHAR(M)型:定长字符串类型,当存储时,总是用空格填满右边到指定的长度

5、BLOB TEXT 类型,最大长度为65535个字符

6、VARCHAR型:变长字符串类型


例:

mysql> create table test(id int(4) not null primary key auto_increment, name char(20) not null);

Query OK, 0 rows affected (0.08 sec)




查看表结构

mysql> desc test;

+-------+----------+------+-----+---------+----------------+

| Field | Type     | Null | Key | Default | Extra          |

+-------+----------+------+-----+---------+----------------+

| id    | int(4)   | NO   | PRI | NULL    | auto_increment |

| name  | char(20) | NO   |     | NULL    |                |

+-------+----------+------+-----+---------+----------------+

2 rows in set (0.00 sec)


查看建表语句

mysql> show create table from test\G

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from test' at line 1

mysql> show create table test\G

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

       Table: test

Create Table: CREATE TABLE `test` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=gbk

1 row in set (0.00 sec)


插入数据

命令:insert into 表名[(字段名1)(字段名n)] values (值1)(值2)]


mysql> desc test;

+-------+----------+------+-----+---------+----------------+

| Field | Type     | Null | Key | Default | Extra          |

+-------+----------+------+-----+---------+----------------+

| id    | int(4)   | NO   | PRI | NULL    | auto_increment |

| name  | char(20) | NO   |     | NULL    |                |

+-------+----------+------+-----+---------+----------------+

2 rows in set (0.01 sec)


mysql> insert into test values(1,'user1');

Query OK, 1 row affected (0.00 sec)


mysql> select * from test;

+----+-------+

| id | name  |

+----+-------+

|  1 | user1 |

+----+-------+

1 row in set (0.00 sec)


mysql> insert into test (id,name) values (3,'user3');

Query OK, 1 row affected (0.00 sec)


mysql> select * from test;

+----+-------+

| id | name  |

+----+-------+

|  1 | user1 |

|  2 | user2 |

|  3 | user3 |

+----+-------+

3 rows in set (0.00 sec)


mysql> insert into test(name) values('user4')

    -> ;

Query OK, 1 row affected (0.00 sec)


mysql> select * from test;

+----+-------+

| id | name  |

+----+-------+

|  1 | user1 |

|  2 | user2 |

|  3 | user3 |

|  4 | user4 |

+----+-------+

4 rows in set (0.00 sec)


mysql> insert into test (id,name) values (5,'user5'),(6,'user6');

Query OK, 2 rows affected (0.00 sec)

Records: 2  Duplicates: 0  Warnings: 0


mysql> select * from test;

+----+-------+

| id | name  |

+----+-------+

|  1 | user1 |

|  2 | user2 |

|  3 | user3 |

|  4 | user4 |

|  5 | user5 |

|  6 | user6 |

+----+-------+

6 rows in set (0.00 sec)


mysql> insert into test(name) values('user7'),('user8');

Query OK, 2 rows affected (0.00 sec)

Records: 2  Duplicates: 0  Warnings: 0


mysql> select * from test;

+----+-------+

| id | name  |

+----+-------+

|  1 | user1 |

|  2 | user2 |

|  3 | user3 |

|  4 | user4 |

|  5 | user5 |

|  6 | user6 |

|  7 | user7 |

|  8 | user8 |

+----+-------+

8 rows in set (0.00 sec)


you数据库临时备份

[root@localhost mysql]# mysqldump -uroot -p'root' -P 3306 -S /var/lib/mysql/mysql.sock  -B you > /tmp/you_bak.sql


查看备份发数据库内容

[root@localhost tmp]# egrep -v "^$|#|\*|--" you_bak.sql

USE `you`;

DROP TABLE IF EXISTS `test`;

CREATE TABLE `test` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=gbk;

LOCK TABLES `test` WRITE;

INSERT INTO `test` VALUES (1,'user1'),(2,'user2'),(3,'user3'),(4,'user4'),(5,'user5'),(6,'user6'),(7,'user7'),(8,'user8');

UNLOCK TABLES;


查询格式

命令:select <字段1,字段2,....> from <表格> where <表达式>


mysql> select * from test limit 0,2 ;

+----+-------+

| id | name  |

+----+-------+

|  1 | user1 |

|  2 | user2 |

+----+-------+

2 rows in set (0.00 sec)


mysql> select * from test limit 2,6 ;

+----+-------+

| id | name  |

+----+-------+

|  3 | user3 |

|  4 | user4 |

|  5 | user5 |

|  6 | user6 |

|  7 | user7 |

|  8 | user8 |

+----+-------+

6 rows in set (0.00 sec)


查倒顺的前两行

mysql> select * from test order by id desc limit 0,2 ;

+----+-------+

| id | name  |

+----+-------+

|  8 | user8 |

|  7 | user7 |

+----+-------+

2 rows in set (0.00 sec)


升顺查找

mysql> select * from test order by id asc limit 0,2 ;

+----+-------+

| id | name  |

+----+-------+

|  1 | user1 |

|  2 | user2 |

+----+-------+

2 rows in set (0.00 sec)


查询某一条name记录

mysql> select * from test where name='user2' ;

+----+-------+

| id | name  |

+----+-------+

|  2 | user2 |

+----+-------+

1 row in set (0.00 sec)


查找范围

mysql> select * from test where id >2 and id <6 ;

+----+-------+

| id | name  |

+----+-------+

|  3 | user3 |

|  4 | user4 |

|  5 | user5 |

+----+-------+

3 rows in set (0.00 sec)


字符一定要带单引号


mysql> select * from test where id > 7 or id < 2 ;

+----+-------+

| id | name  |

+----+-------+

|  1 | user1 |

|  8 | user8 |

+----+-------+

2 rows in set (0.00 sec)


两张表条件关联查询

mysql> select test.id,test.name,test1.name,test1.age from test,test1  where test.name=test1.name;

+----+-------+-------+-----+

| id | name  | name  | age |

+----+-------+-------+-----+

|  7 | user7 | user7 |  18 |

|  8 | user8 | user8 |  13 |

+----+-------+-------+-----+

2 rows in set (0.00 sec)


mysql> select test.id,test.name,test1.name,test1.age from test,test1  where test.name=test1.name and test1.name='xiaoyou';

Empty set (0.00 sec)


修改表中的数据

update 表名 set 字段=新值,... where 条件

条件一定要加 where

mysql> update test set name='xiaoyou' where name='user4';

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0


mysql> select * from test;

+----+---------+

| id | name    |

+----+---------+

|  1 | user1   |

|  2 | user2   |

|  3 | user3   |

|  4 | xiaoyou |

|  5 | user5   |

|  6 | user6   |

|  7 | user7   |

|  8 | user8   |

+----+---------+

8 rows in set (0.01 sec)


不允许这样操作,一定要加条件

mysql> update test set name='xiaoyou';

Query OK, 7 rows affected (0.00 sec)

Rows matched: 8  Changed: 7  Warnings: 0


mysql> select * from test;

+----+---------+

| id | name    |

+----+---------+

|  1 | xiaoyou |

|  2 | xiaoyou |

|  3 | xiaoyou |

|  4 | xiaoyou |

|  5 | xiaoyou |

|  6 | xiaoyou |

|  7 | xiaoyou |

|  8 | xiaoyou |

+----+---------+

8 rows in set (0.00 sec)


恢复错复

[root@localhost mysql]# mysql -uroot -p'root' -P 3306 -S /var/lib/mysql/mysql.sock < /tmp/you_bak.sql


mysql> delete from test where id >3;

Query OK, 3 rows affected (0.01 sec)


mysql> select * from test;

+----+---------+

| id | name    |

+----+---------+

|  1 | user1   |

|  2 | user2   |

|  3 | xiaoyou |

+----+---------+

3 rows in set (0.00 sec)


mysql> delete from test where id =3;

Query OK, 1 row affected (0.00 sec)


mysql> select * from test;

+----+-------+

| id | name  |

+----+-------+

|  1 | user1 |

|  2 | user2 |

+----+-------+

2 rows in set (0.00 sec)


mysql> select * from test;

+----+-------+

| id | name  |

+----+-------+

|  1 | user1 |

|  2 | user2 |

+----+-------+

2 rows in set (0.00 sec)


删除表中的数据

mysql> delete from test where id =1;

Query OK, 1 row affected (0.00 sec)


不充许这样操作,一定要加条件

mysql> select * from test;

+----+-------+

| id | name  |

+----+-------+

|  2 | user2 |

+----+-------+

1 row in set (0.00 sec)


mysql> delete from test;

Query OK, 1 row affected (0.00 sec)


直接把表清空

mysql> truncate table test;

Query OK, 0 rows affected (0.00 sec)


mysql> select * from test;

Empty set (0.00 sec)


在表中添加字段

mysql> alter table test1 add sex int(4);

Query OK, 0 rows affected (0.01 sec)

Records: 0  Duplicates: 0  Warnings: 0


mysql> alter table test1 add agg int(4) after name;

Query OK, 0 rows affected (0.01 sec)

Records: 0  Duplicates: 0  Warnings: 0


mysql> desc test1

    -> ;

+-------+----------+------+-----+---------+----------------+

| Field | Type     | Null | Key | Default | Extra          |

+-------+----------+------+-----+---------+----------------+

| id    | int(4)   | NO   | PRI | NULL    | auto_increment |

| name  | char(20) | NO   |     | NULL    |                |

| agg   | int(4)   | YES  |     | NULL    |                |

| sex   | int(4)   | YES  |     | NULL    |                |

+-------+----------+------+-----+---------+----------------+

4 rows in set (0.00 sec)


删除字段

mysql> alter table test1 drop agg;

Query OK, 0 rows affected (0.01 sec)

Records: 0  Duplicates: 0  Warnings: 0


mysql> desc test1;

+-------+----------+------+-----+---------+----------------+

| Field | Type     | Null | Key | Default | Extra          |

+-------+----------+------+-----+---------+----------------+

| id    | int(4)   | NO   | PRI | NULL    | auto_increment |

| name  | char(20) | NO   |     | NULL    |                |

| sex   | int(4)   | YES  |     | NULL    |                |

+-------+----------+------+-----+---------+----------------+

3 rows in set (0.00 sec)


修改表名

mysql> rename table test1 to test;

Query OK, 0 rows affected (0.00 sec)


mysql> show tables;

+-----------------+

| Tables_in_user1 |

+-----------------+

| test            |

+-----------------+

1 row in set (0.00 sec)


mysql>drop table test1;


mysql> insert into test(name) values('小游');

Query OK, 1 row affected (0.00 sec)


mysql> select * from test;

+----+-----------+------+

| id | name      | sex  |

+----+-----------+------+

|  1 | user1     | NULL |

|  2 | user2     | NULL |

|  3 | user3     |   16 |

|  4 | user4     |   18 |

|  5 | user5     |   19 |

|  6 | xiaohu    | NULL |

|  7 | 小游    | NULL |

+----+-----------+------+

8 rows in set (0.00 sec)


如果不支持中文,一定要先set names gbk,不然出现乱码


改服务端字符集

更改my.cnf参数

[mysqld] 一定要在mysqld下面加

default-character-set=gbk


改客户端字符集

如果不支持中文,可以在备份文件加入set names gbk还原

mysql> set names gbk;

Query OK, 0 rows affected (0.00 sec)


mysql> select * from test where name='小游';

+----+--------+------+

| id | name   | sex  |

+----+--------+------+

|  7 | 小游 | NULL |

+----+--------+------+

1 row in set (0.00 sec)


在linux命令行执行mysql里命令

[root@localhost ~]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock -e "show databases;"

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| test               |

| user1              |

+--------------------+


[root@localhost tmp]# egrep -v "#|\*|--|^$" /tmp/user1_bak.sql 

备份数据库

mysqldump -uroot -p'root' -S /var/lib/mysql/mysql.sock -B user1 > /tmp/user1_bak.sql

还原数据库

mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock -B user1 < /tmp/user1_bak.sql


提示:

1、文件本文字符集要正确gb2312

2、文件里加入set names gbk;

3、恢复时执行mysql --defaul-character-set


mysql字符集介绍

GBK 定长 双字节 不是国际标准,支持的系统不少

UTF-8 非定长 1-4字节 广泛支持,MYSQL也使用UTF-8

latin1 MYSQL默认字符集


查看默认节符集

mysql> show variables like 'character_set%';

+--------------------------+----------------------------+

| Variable_name            | Value                      |

+--------------------------+----------------------------+

| character_set_client     | latin1                     |

| character_set_connection | latin1                     |

| character_set_database   | latin1                     |

| character_set_filesystem | binary                     |

| character_set_results    | latin1                     |

| character_set_server     | latin1                     |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

8 rows in set (0.00 sec)


修改后的

mysql> set names gbk;

mysql> show variables like 'character_set%';

+--------------------------+----------------------------+

| Variable_name            | Value                      |

+--------------------------+----------------------------+

| character_set_client     | gbk                        |

| character_set_connection | gbk                        |

| character_set_database   | latin1                     |

| character_set_filesystem | binary                     |

| character_set_results    | gbk                        |

| character_set_server     | latin1                     |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

8 rows in set (0.00 sec)


改服务端字符集

更改my.cnf参数

[mysqld] 一定要在mysqld下面加

default-character-set=gbk


改客户端字符集

如果不支持中文,可以在备份文件加入set names gbk还原

mysql> set names gbk;

Query OK, 0 rows affected (0.00 sec)


1、在服务器my.cnf配置文件里[mysqld]模块下添加字符集配置,重启生效生,创建数据库和表默认都是这个设置的字符集。


2、客户端字符集设置,set names gbk; 这样可以确保插入后的中文 ,不出现乱码,对执行set names gbk;之前插入的中文无效。


在linux登陆和mysql下的set names gbk;相同

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock --default-character-set=gbk 


mysql> show variables like 'character_set%';

+--------------------------+--------------------------------------------+

| Variable_name            | Value                                      |

+--------------------------+--------------------------------------------+

| character_set_client     | gbk     #客户端字符集set names gbk;        |

| character_set_connection | gbk     #连接字符集 set names gbk;         |

| character_set_database   | gbk  #数据库字符集 配置文件或建库建表指定  |

| character_set_filesystem | binary                                     |

| character_set_results    | gbk   #返回结果字符集,set names gbk;      |

| character_set_server     | gbk   #服务器字符集 配置文件或建库建表指定 |

| character_set_system     | utf8                                       |

| character_sets_dir       | /usr/share/mysql/charsets/                 |

+--------------------------+--------------------------------------------+

8 rows in set (0.00 sec)


linux命令行查看表

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "select * from user1.test;"  user1是数据库 test是数据库里的表

+----+--------+------+

| id | name   | sex  |

+----+--------+------+

|  1 | user1  | NULL |

|  2 | user2  | NULL |

|  3 | user3  |   16 |

|  4 | user4  |   18 |

|  5 | user5  |   19 |

|  6 | xiaohu | NULL |

|  7 | 小游 | NULL |

+----+--------+------+


[root@localhost ~]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock -e "set names gbk;select * from data1.test;"

+----+--------+------+-----+------+

| id | name   | sex  | age | org  |

+----+--------+------+-----+------+

|  1 | user1  | NULL |   0 | NULL |

|  2 | user2  | NULL |  26 | NULL |

|  4 | user4  | NULL |   0 | NULL |

|  5 | user5  | NULL |   0 | NULL |

|  6 | user6  | NULL |   0 | NULL |

|  7 | 小游 | NULL |   0 | NULL |

|  8 | 小游 | NULL |   0 | NULL |

+----+--------+------+-----+------+


查看mysql支持引擎

mysql> show engines;

+------------+---------+------------------------------------------------------------+--------------+------+------------+

| Engine     | Support | Comment                                                    | Transactions | XA   | Savepoints |

+------------+---------+------------------------------------------------------------+--------------+------+------------+

| MRG_MYISAM | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |

| CSV        | YES     | CSV storage engine                                         | NO           | NO   | NO         |

| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |

| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |

| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |

+------------+---------+------------------------------------------------------------+--------------+------+------------+

5 rows in set (0.00 sec)


备份数据库

普通备份

[root@localhost ~]# mysqldump -uroot -p'root'  data1 >/tmp/data_bak.sql


[root@localhost ~]# mysqldump -uroot -p'root' -S /var/lib/mysql/mysql.sock data1|gzip  >/tmp/data$(date +%F).sql.gz


备份多个库 data1 you_bgk

[root@localhost tmp]# mysqldump -uroot -p'root' -S /var/lib/mysql/mysql.sock -B data1 you_bgk|gzip >/tmp/database_bak$(date +%F).sql.gz


如果分库备份


备份表 data1是库名  test是表名

[root@localhost tmp]# mysqldump -uroot -p'root' -S /var/lib/mysql/mysql.sock data1 test >/tmp/test_table.sql


备份多张表  data1是库名  test是表名 aaa是表名

[root@localhost tmp]# mysqldump -uroot -p'root' -S /var/lib/mysql/mysql.sock data1 test aaa >/tmp/test_table.sql


备份库和表结构

[root@localhost tmp]# mysqldump -uroot -p'root' -S /var/lib/mysql/mysql.sock -d data1 >/tmp/aaa.sql


[root@localhost tmp]# egrep -v "^$|#|\*|--" aaa.sql 

DROP TABLE IF EXISTS `aaa`;

CREATE TABLE `aaa` (

  `name` char(20) NOT NULL,

  `age` int(3) NOT NULL,

  PRIMARY KEY (`name`)

) ENGINE=MyISAM DEFAULT CHARSET=gbk;

DROP TABLE IF EXISTS `test`;

CREATE TABLE `test` (

  `id` int(3) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  `sex` int(4) DEFAULT NULL,

  `age` int(4) NOT NULL,

  `org` int(4) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=29 DEFAULT CHARSET=gbk;


让备份结果输出少一些  --compact

[root@localhost tmp]# mysqldump -uroot -p'root' -S /var/lib/mysql/mysql.sock  --compact -d data1 >/tmp/aaa.sql


恢复数据库

1、source 命令恢复

用source加linux命令行的路径直接恢复mysql数据

mysql> source /tmp/tmp.sql

Database changed

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.05 sec)

Query OK, 0 rows affected (0.00 sec)


[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "source /tmp/tmp.sql "


2、mysql命令导入更新恢复

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  < /tmp/tmp.sql 


假定开发人员让我们插入数据到数据库,可能是邮件发的,内容可能是字符串或都是下面的文件,带中文

sql文里没有use data1的时候,在导入时路径就必须指定数据库名

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  < /tmp/aa.sql 


mysql -e实现非交互式对话

[root@localhost tmp]# mysql -uroot -p'root' -e "select * from data1.test;"

echo 和 -e 类似命令

[root@localhost tmp]# echo "show status" | mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock


[root@localhost tmp]#cat | mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock << EOF 

show databases; 

EOF

[root@localhost tmp]# cat | mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock << EOF  

> show databases; 

> EOF

Database

information_schema

anni_bgk

data0

data1

data2

data3

mysql

you

you1


[root@localhost tmp]# mysql -uroot -p'root' -e "select * from data1.test;select * from data1.aaa;"


查看mysql状态

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "show processlist;"


[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "show full processlist;"

+----+------+-----------+-------+---------+------+-------+-----------------------+

| Id | User | Host      | db    | Command | Time | State | Info                  |

+----+------+-----------+-------+---------+------+-------+-----------------------+

|  3 | root | localhost | data1 | Sleep   |  168 |       | NULL                  |

|  7 | root | localhost | NULL  | Query   |    0 | NULL  | show full processlist |

+----+------+-----------+-------+---------+------+-------+-----------------------+


mysql sleep过多的问题

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "show full processlist;" |egrep -v "sleep"

Id User Host db Command Time State Info

3 root localhost data1 Sleep 291 NULL

10 root localhost NULL Query 0 NULL show full processlist


查看mysql参数

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "show variables"


查看mysql状态

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "show status"


查看mysql各个查询状态

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "show global status"


过滤Com_select|Com_insert|Com_delete|Com_update

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "show global status"| egrep "Com_select|Com_insert|Com_delete|Com_update"

Com_delete 0

Com_delete_multi 0

Com_insert 0

Com_insert_select 0

Com_select 18

Com_update 0

Com_update_multi 0


查看引擎的缓冲区

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "show variables;"|grep key_buffer

key_buffer_size 8384512


设置缓冲区 

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "set global key_buffer_size = 32776192;"

[root@localhost tmp]# mysql -uroot -p'root' -S /var/lib/mysql/mysql.sock  -e "show variables;"|grep key_buffer

key_buffer_size 32776192  #32M


源码包

[root@localhost tmp]# vim /data/3306/my.cnf

sedi -i 's#key_buffer_size = 16M# key_buffer_size = 32M#g' /data/3306/my.cnf


安装mysql

建立mysql帐号

groupadd mysql;

useradd -s /sbin/nologin -g mysql -M mysql;

-s /sbin/nologin 表示禁止该用户登陆,加强安全

-g mysql 指定属于mysql组

-M 表示不创建用户家目录


查看创建的用户

tail -1 /etc/passwd

mysql:x:500:500::/home/mysql:/sbin/nologin


编绎之前安装gcc  yum -y install gcc*

                 yum -y install ncurses-devel


./configure \

--prefix=/usr/local/mysql \

--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \

--localstatedir=/usr/local/mysql/data \

--enable-assembler \

--enable-thread-safe-client \

--with-mysqld-user=mysql \

--with-big-tables \

--without-debug \

--with-prthread \

--enable-assembler \

--with-extra-charsets=complex \

--with-readline \

--with-ssl \

--with-embedded-server \

--enable-local-infile \

--with-plugins=partition,innobase \

--with-plugin-PLUGIN \

--with-mysqld-ldflags=-all-static \

--with-client-ldflags=-all-static


make && make install

ls /usr/local/mysql/

killall mysqld

以前的mysql单实例清除

生产环境多实例 内存16G,双CPU 八核,磁盘6*600G sas 15k


主从同步

mysql> grant replication slave on *.* to rep@'172.20.100.%' identified by '123456';

Query OK, 0 rows affected (0.00 sec)


replication slave 为mysql同步的必须权限,此处不要授权all

*.*所有库所有表


mysql> select user,host from mysql.user;

+------+-----------------------+

| user | host                  |

+------+-----------------------+

| root | 127.0.0.1             |

| rep  | 172.20.100.%          |

|      | localhost             |

| root | localhost             |

|      | localhost.localdomain |

| root | localhost.localdomain |

+------+-----------------------+

6 rows in set (0.00 sec)


生产环境时,操作主从复制,需要申请停机时间。锁表会影响业务

锁表主库

mysql> flush tables with read lock;

Query OK, 0 rows affected (0.00 sec)


锁表失效时间以下

mysql> show variables like '%timeout%';

+----------------------------+-------+

| Variable_name              | Value |

+----------------------------+-------+

| connect_timeout            | 10    |

| delayed_insert_timeout     | 300   |

| innodb_lock_wait_timeout   | 120   |

| innodb_rollback_on_timeout | OFF   |

| interactive_timeout        | 28800 |

| net_read_timeout           | 30    |

| net_write_timeout          | 60    |

| slave_net_timeout          | 3600  |

| table_lock_wait_timeout    | 50    |

| wait_timeout               | 28800 |

+----------------------------+-------+

10 rows in set (0.00 sec)


mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000004 |      536 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)


[root@localhost ~]# mysqldump -uroot -p -S /data/3306/mysql.sock -A -B |gzip >/server/backup/mysql_bak.$(date +%F).sql.gz

-A 备份所有库

-B 添加参数比如DROP等

[root@localhost backup]# ls

mysql_bak.2017-04-21.sql.gz


解锁表

mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)


从库操作


[root@localhost backup]# mysql -uroot -p -S /data/3307/mysql.sock < /server/backup/mysql_bak.2017-04-21.sql 


如果需要停掉从库,执行以下命令

[root@localhost ~]# mysql -uroot -p -S /data/3307/mysql.sock -e "stop slave;


方法1

cat |mysql -uroot -p'root' -S /data/3307/mysql.sock<< EOF

 CHANGE MASTER TO  

 MASTER_HOST='172.20.100.134', 

 MASTER_PORT=3306,

 MASTER_USER='rep', 

 MASTER_PASSWORD='123456', 

 MASTER_LOG_FILE='mysql-bin.000001',

 MASTER_LOG_POS=460;

EOF


方法2

mysql>  CHANGE MASTER TO  

    ->  MASTER_HOST='172.20.100.134', 

    ->  MASTER_PORT=3306,

    ->  MASTER_USER='rep', 

    ->  MASTER_PASSWORD='123456', 

    ->  MASTER_LOG_FILE='mysql-bin.000004',

    ->  MASTER_LOG_POS=536;

Query OK, 0 rows affected (0.10 sec)


启动同步开关

[root@localhost backup]# mysql -uroot -p -S /data/3307/mysql.sock -e "start slave;"


[root@localhost backup]# mysql -uroot -p -S /data/3307/mysql.sock -e "show slave status\G"

Enter password: 

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

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 172.20.100.134

                  Master_User: rep

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000004

          Read_Master_Log_Pos: 696

               Relay_Log_File: relay-bin.000002

                Relay_Log_Pos: 411

        Relay_Master_Log_File: mysql-bin.000004

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB: 

          Replicate_Ignore_DB: mysql

           Replicate_Do_Table: 

       Replicate_Ignore_Table: 

      Replicate_Wild_Do_Table: 

  Replicate_Wild_Ignore_Table: 

                   Last_Errno: 0

                   Last_Error: 

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 696

              Relay_Log_Space: 560

              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: 0     #和主库比同步延迟的秒数,这个参数很重要。

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error: 

               Last_SQL_Errno: 0

               Last_SQL_Error: 

查看状态

[root@localhost backup]# mysql -uroot -p'123456' -S /data/3307/mysql.sock -e "show slave status\G" | egrep "Slave_IO_Running|Slave_SQL_Running"

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes



如果报错1007

[root@localhost ~]# mysql -uroot -p -S /data/3307/mysql.sock -e "stop slave;"

[root@localhost ~]# mysql -uroot -p -S /data/3307/mysql.sock -e "set global sql_slave_skip_counter =1 ;" 1就是忽略1次更新,不推荐

[root@localhsot ~]# mysql -uroot -p -S /data/3307/mysql.sock -e "start slave;"


不加班在工作时间轻松配置从库 

在服务器压力比较小的时候备份

1、锁表备份全备一份

2、锁表前后取得show master status值记录日志里



binlog-ignore-db=information_schema

binlog-ignore-db=mysql


主从库授权


在生产环境以下参考

主库(提供写服务)     用户user  密码user123 ip 172.20.100.1 port 3306

从库(提供读服务)     用户user  密码user123 ip 172.20.100.2 port 3306