Mysql学习笔记详解(二)--mysql管理

本文详述了MySQL的管理操作,包括备份与导入数据库的注意事项,如如何避免用户信息变动,以及Mysql常用命令如查看数据库、表、字段和数据。还深入探讨了Mysql主从复制的指令,如清理二进制日志。最后讲解了用户管理,包括用户权限表的管理和如何添加、修改、删除用户及其权限。
摘要由CSDN通过智能技术生成

系统环境

root@0f8b56ea5203:/# cat /etc/issue
Debian GNU/Linux 9 \n \l
root@0f8b56ea5203:/# mysql --version
mysql  Ver 14.14 Distrib 5.6.40, for Linux (x86_64) using  EditLine wrapper

备份与导入数据库

备份数据库
mysqldump -u用户名 -p密码 --lock-all-tables --all-databases > all.sql
导入数据库
mysql -u用户名 -p密码 < all.sql

注意:-p后面直接跟密码,不能有空格或者不写密码,回车后输入(推荐)
-u可直接跟用户名,也可空格后跟用户名

优点:备份完整,用户名和密码也一并备份
缺点:导入之后可能会改动原有的数据库用户信息(覆盖/重复/修改密码)

–lock-all-tables参数
指定–lock-all-tables参数,那么从一开始就对整个mysql实例加global read lock锁。
这整个全局读锁会一直持续到导出结束。
所以在这个过程中,数据库实际严格处于read only状态。
所以导出的数据库在数据一致性上是被严格保证的,也就是数据是一致性的。

导出某个数据库

mysqldump -u用户名  -p --databases 数据库名 > name.sql

bash脚本

#!/bin/bash
USER="用户名"
PASSWORD="密码"
databases=`mysql -u$USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`
for db in $databases; do
    if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
        echo "Dumping database: $db"
        mysqldump -u$USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
       # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
    fi
done

优点:因为未导出数据库mysql不影响MySQL本身的信息,不会改动原有数据库的用户名和密码
缺点:导入之后需要手动建立用户名并赋予权限,需重新修改网站配置文件

遇到的问题
1.使用mysqldump备份时提示(errno: 24) when using LOCK TABLES
添加–lock-tables=false解决,如

mysqldump -u root  -p  --lock-tables=false --databases baotuquan > baotuquan.sql

Mysql常用命令

1、查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
2、查看表
mysql> use 数据库名 ;  #切换到表
mysql> show tables;
3、查看字段
show columns from `数据库名`.`数据表名`;
mysql> show columns from mysql.db;
+-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host                  | char(60)      | NO   | PRI |         |       |
| Db                    | char(64)      | NO   | PRI |         |       |
| User                  | char(16)      | NO   | PRI |         |       |
| Select_priv           | enum('N','Y') | NO   |     | N       |       |
| Insert_priv           | enum('N','Y') | NO   |     | N       |       |
| Update_priv           | enum('N','Y') | NO   |     | N       |       |
| Delete_priv           | enum('N','Y') | NO   |     | N       |       |
| Create_priv           | enum('N','Y') | NO   |     | N       |       |
............................
mysql> desc mysql.db;
+-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host                  | char(60)      | NO   | PRI |         |       |
| Db                    | char(64)      | NO   | PRI |         |       |
| User                  | char(16)      | NO   | PRI |         |       |
| Select_priv           | enum('N','Y') | NO   |     | N       |       |
| Insert_priv           | enum('N','Y') | NO   |     | N       |       |
| Update_priv           | enum('N','Y') | NO   |     | N       |       |
...........................
4、查看数据
mysql> select `字段1`,`字段2`,`更多字段` from `数据库名`.`数据表名`  [ where 条件] [LIMIT n] [OFFSET M]';
mysql> select Host,User from mysql.user;
+-----------+------+
| Host      | User |
+-----------+------+
| %         | root |
| localhost | root |
+-----------+------+
2 rows in set (0.00 sec)
Mysql主从相关指令

1、PURGE MASTER LOGS #清理二进制日志

PURGE {MASTER | BINARY} LOGS TO 'log_name'
PURGE {MASTER | BINARY} LOGS BEFORE 'date'

用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。

例如:

PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2003-04-02 22:46:26';
BEFORE变量的date自变量可以为'YYYY-MM-DD hh:mm:ss'格式。MASTER和BINARY是同义词。

如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。

要清理日志,需按照以下步骤:

  1. 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
  2. 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
  3. 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
  4. 制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)
  5. 清理所有的日志,但是不包括目标日志。

Mysql用户管理

MySQL用户管理:添加用户、授权、删除用户

Mysql的每个用户存储在mysql数据库中的user数据表中,也就是我们可以从这里快速更改用户名和权限,host,用户密码是以passwd()加密之后的所以不能直接更改,因此对用户的管理,基本上就是对数据库mysql的修改

MySQL授权系统主要通过五个表(user、db、host、tables_priv和columns_priv)来实现,其中用于访问数据库的各种用户信息都保存在mysql库的user表中。账户权限信息被存储在mysql数据库的user、db、host、tables_priv、columns_priv和procs_priv表中。

  • user表存储用户的全局权限,如登陆地址,用户名,全局不同权限,密码等数据分别对应Hosts,User,权限.priv,authentication_string等字段
  • db表存储用户对某数据库的权限,如登陆地址,数据库名,用户名,各个权限等数据分别对应Hosts,Db,User,权限.priv。包含在db表中的权限适用于这个表标识的数据库。
  • host表——当您想在db表的范围之内扩展一个条目时,就会用到这个表。举例来说,如果某个db允许通过多个主机访问的话,那么超级用户就可以让db表内将host列为空,然后用必要的主机名填充host表。
  • tables_priv表——该表与db表相似,不同之处是它存储用户对某表的权限。
  • columns_priv——该表作用几乎与db和tables_priv表一样,存储的是针对某些表特定列的权限。
用户权限表的管理

权限表的存取过程是:
1) 先从user表中的host、 user、 password这3个字段中判断连接的IP、用户名、密码是否存在表中,存在则通过身份验证;
2) 通过权限验证,进行权限分配时,按照user、db、tables_priv、columns_priv的顺序进行分配。即先检查全局权限表 user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db,tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检 查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。

1、添加用户
mysql> create user 用户名@’host地址’ identified by ‘密码’;
此时可以通过phpMyAdmin或者mysql> select Host,User from mysql.user;可查看到以添加的用户
@’host地址’缺省为@’%’所有地址,localhost代表本地地址即127.0.0.1,具体每个数据库.数据表的权限由以下决定

mysql> create user test1@'localhost' identified by '111111';
Query OK, 0 rows affected (0.01 sec)

mysql> select User,Host from mysql.user;
+-------+-----------+
| User  | Host      |
+-------+-----------+
| root  | %         |
| root  | localhost |
| test1 | localhost |
+-------+-----------+
3 rows in set (0.00 sec)

2、给用户权限
mysql> grant 权限 on 数据库.数据表 to 用户名@’host地址’ identified by ‘密码’;
mysql> flush privileges
flush privileges刷新MySQL的系统权限相关表 权限(不分大小写)

mysql> grant all privileges on test01.* to user01@'localhost' identified by '111111';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

SELECT 提取/查看
INSERT 插入
UPDATE 更新/改变
ALL表示所有权限
数据库/数据表不存在会报错,可以数据库.*表示整个数据库
用户地址密码,如果不存在该用户,则自动创建用户@’host地址’缺省为@’%’所有地址
一个用户支持不同的访问地址(一个host地址只有一个密码,如果已存在密码不用输入,输入则覆盖),每执行一次命令就在mysql.user内添加相应Hsot,User,各种权限priv,密码`等字段

例:添加库.表的权限
添加netstu1.jia_netq表select权限为已有用户chen,地址为%,密码为chen默认密码

mysql> show tables;
+------------------+
| Tables_in_test01 |
+------------------+
| tutorials_tbl    |
+------------------+
1 row in set (0.00 sec)

mysql> grant select on test01.tutorials_tbl to chen;
Query OK, 0 rows affected (0.00 sec)
mysql> select Host,Db,User,Table_name from mysql.tables_priv where User = 'chen';
+------+--------+------+---------------+
| Host | Db     | User | Table_name    |
+------+--------+------+---------------+
| %    | test01 | chen | tutorials_tbl |
+------+--------+------+---------------+
1 row in set (0.00 sec)

3、修改密码
使用PASSWD()函数生成密码的密文并更新到mysql数据库的密码字段

注意:MySQL 5.7 以前版本密码字段为Password

mysql> update mysql.user set password = password('密码') where user = '用户名' and host = 'host地址';

MySQL 5.7 以后版本(Password字段改为了authentication_string)

mysql> update mysql.user set authentication_string=PASSWORD('密码') where user='用户名' and host = 'host地址';
mysql> flush privileges;

4、删除权限

drop user zhangsan@'host地址';
drop user命令会删除用户以及对应的权限,执行命令后你会发现mysql.user表和mysql.db等表的相应记录都消失了。

5、mysql 找回root密码
1).首先确认服务器出于安全的状态
也就是没有人能够任意地连接MySQL数据库。 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录和修改MySQL的信息。

2).修改mysql登陆设置
修改配置文件,我服务器(ubuntu16.04 Mysql 5.7.19)文件在/etc/mysql/mysql.conf.d/mysqld.cnf,其他教程都说在/etc/mysql/my.cnf

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
在[mysqld]下面添加skip-grant-tables
使得:任何的帐号用任何的密码(当然也包括空)都可以登录到mysql数据库

3).重新启动mysqld
sudo /etc/init.d/mysql restart

4). 登陆并修改Mysql root 密码
就是替换mysql.user中root用户对应的密码字段
按照登陆,修改用户密码修改root密码

表的管理

删除数据表
mysql> drop table 数据库名.数据表名;
mysql> use 数据库名;
mysql> drop table 数据表名;

修改数据表名
mysql> alter table 数据库名.数据表名 rename to 数据库名.数据表名

字段管理

字段管理
1)添加字段
alter table 数据库名.数据表名 add (字段3 属性,字段4 属性);
2)删除字段
alter table 数据库名.数据表名 drop 字段名;
3)修改字段
alter table 数据库名.数据表名 change 旧段名 新字段名 修改属性;
4)记录/数据管理
添加记录
mysql> insert into 数据库名.数据表名 (字段1,字段2,字段3,更多字段) value (值1,值2,值3,更多值);
如果数据是字符型,必须使用单引号或者双引号,如:”value”。

查询记录/数据
mysql> select 字段1,字段2,更多字段 from 数据库名.数据表名 [ where 条件] [LIMIT n] [OFFSET M] ;
字段1,字段2为显示的字段
[ where 条件] 可选,展示符合条件的字段,如where 字段1=
[LIMIT n] 和[OFFSET M]配合使用,LIMIT确定最多显示的记录数,OFFSET决定从查询到的记录数偏移几个开始显示,默认0,不偏移,从第一个显示

示例

mysql>  select `字段1`,`字段2` from `cndaqiangdb`.`table1` where `字段1`=1 limit 2 offset 1;
+-------+-------+
| 字段1 | 字段2 |
+-------+-------+
|   1   |   2   |
|   1   |   2   |
+-------+-------+
2 rows in set (0.00 sec)

删除记录/数据
mysql> delete from 数据库名.数据表名 [where 条件];
[where 条件]如果不写,则删除数据表内的所有记录/数据

更新/修改记录
mysql> update 数据库名.数据表名 set 字段1=值1,字段2=值2 [where 条件];
[where 条件]如果不写,则替换所有记录的相应字段

批量替换
mysql> update 数据库名.数据表名 set 字段=replace(字段,旧值,新值);
可以替换,数字,字符串等,替换字符串时,注意加引号

示例

mysql>  select `1`,`2`,`3`,`4` from `cndaqiangdb`.`table1`;
+-----+-----+-----+-----+
| 1   | 2   | 3   | 4   |
+-----+-----+-----+-----+
| 222 | 222 | 333 | 444 |
| 222 | 222 |   3 | 444 |
+-----+-----+-----+-----+
2 rows in set (0.00 sec)

mysql> update `cndaqiangdb`.`table1` set `1`=replace(`1`,2,222);
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql>  select `1`,`2`,`3`,`4` from `cndaqiangdb`.`table1`;
+-----------+-----+-----+-----+
| 1         | 2   | 3   | 4   |
+-----------+-----+-----+-----+
| 222222222 | 222 | 333 | 444 |
| 222222222 | 222 |   3 | 444 |
+-----------+-----+-----+-----+
2 rows in set (0.00 sec)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值