加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

管理MySQL表

发布时间:2023-11-03 15:01:29 所属栏目:MySql教程 来源:
导读:MySQL

数据导入

把系统文件的内容存储到数据库的表里

/etc/passwd studb.user

用户名 密码占位符 uid gid 描述信息 家目录 shell

creat database studb;

create table studb.use
MySQL
 
数据导入
 
把系统文件的内容存储到数据库的表里
 
/etc/passwd     studb.user
 
用户名  密码占位符  uid  gid  描述信息  家目录  shell
 
creat database studb;
 
create table studb.user(
 
name varchar(50),
 
password char(1),
 
uid int(2),
 
gid int(2),
 
comment varchar(100),
 
homedir char(100),
 
shll char(25),
 
index(name),
 
);
 
导入数据格式:
 
如何管理MySQL表
 
msyql> load data infile "目录/文件名" into table 库.表名 fields terminated by “字段间隔符号” lines terminated by “\n”;
 
查看默认使用目录及目录是否存在
 
mysql> show variables like "secure_file_priv";
 
+------------------+-----------------------+
 
| Variable_name    | Value                 |
 
+------------------+-----------------------+
 
| secure_file_priv | /var/lib/mysql-files/ |
 
+------------------+-----------------------+
 
1 row in set (0.00 sec)
 
将数据信息拷贝进默认使用目录
 
cp /etc/passwd /var/lib/mysql-files/
 
ls /var/lib/mysql-files/
 
load data infile "/var/lib/mysql-files/passwd" into table user fields terminated by ":" lines treminated by "\n";
 
alter table studb.user add id int(2) primary key auto_increment first;         添加自增长行号
 
修改目录及查看修改结果
 
mkdir /myfile
 
chown mysql /myfile   赋予权限,让所有者变为mysql
 
vim /etc/my.cnf       修改配置文件,默认使用目录
 
[mysqld]
 
secure_file_priv="/myfile"
 
数据导出:把表记录存储到系统文件里
 
into outfile “目录名/文件名”[fields terminated by "符号" lines terminated by "符号"]
 
eg:
 
mysql> select name,uid from user into outfile “/myfile/user1.txt”
 
mysql> select name,uid from user into outfile “/myfile/user2.txt” fields terminated by "#"   让导出文件间设立间隔号#
 
mysql> select name,uid from user limit 5 into outfile “/myfile/user3.txt”前五行
 
mysql> select id,name from user limit 5 into outfile "/var/lib/mysql-files/4.txt" lines terminated by ":";
 
管理表记录
 

 
insert into 库.表 values(字段值列表);
 
insert into 库.表 values(字段值列表),(字段值列表)
 

 
select 字段名列表 from 库.表;
 
select 字段名列表 from 库.表 where 条件;
 
eg:select * from user where name=“mysql”;  查找user表中所有name=mysql的记录
 
单表查询
 
条件匹配的表示方式:
 
数值比较 > >= < <= = !=
 
字段名 符号 值
 
select name from user where uid=15;   显示uid=15的用户
 
select name,shell from user where shell!=“/bin/bash”;
 
select id,name from user where name=“apache”;
 
范围内比较
 
字段名 in (值列表)    在。。。。里
 
select id,name from user where name in(“apache”,“root”);
 
select id,name from user where uid in(10,15,9,12);
 
字段名 between 值1 and 值2     在。。。之间
 
select  from user where id between 10 and 15;
 
字段名 not in (列表置)  不再。。。里
 
select name from user where uid not in(0,1,7,8);
 
select  from user where name not in(“root”,“mysql“,”bin“);
 
匹配空 is null
 
匹配非空 is not null
 
select id from user where name is null;
 
select id,name,shell from user where shell is not null;
 
insert into user(name)values(“”),(“null”),(null);
 
select id,name from user where name=“”;
 
select id,name from user where name=“null”;
 
distinct 不显示重复值
 
select distinct shell from user;
 
逻辑匹配:有多个条件
 
逻辑与 and    多个条件必须都成立
 
逻辑或 or      多个条件有一个条件成立即可
 
逻辑非 !     取反
 
select name from user where name=“zhangfei” and uid=500 and shell=“/bin/bash”;
 
select name from user where name=“zhangfei” or uid=500 or shell=“/bin/bash”;
 
运算
 
select (uid,gid)uid+gid as(可省略) he(自定义命名) from user where name=“root”
 
模糊查询  like
 
where 字段名 like ‘表达式’;
 
  匹配单个字符
 
%   匹配多个字符
 
eg:select name from user where name like ‘’;
 
select name from user where name like ‘%’;
 
select name from user where name like ‘a’;
 
正则匹配
 
eg
 
insert into user(name)values(“bob9”),(“j7im”),(“1yaya”);
 
select name from user where name regexp ‘[0-9]’;
 
select name from user where name regexp ‘^[0-9]’;
 
select name from user where uid regexp ‘..’;         uid2位及以上
 
select name,uid from user where name regexp '^a.*t';
 
select name,uid from user where name regexp '^r|t$';  以r开头或以t结尾
 
常用的统计函数
 
-avg():集合的平均值
 
-sum():对集合中的各参数求和
 
-min():集合中的最小值
 
-max():集合中的最大值
 
-count():记录的个数
 
select count(name) from user where shell="/bin/bash";
 
select max(uid) from user;
 
select min(gid) from user;
 
select avg() from user;
 
select sum() from user;
 
查询排序
 
sql查询 order by 字段名 asc/desc;(升序/降序,默认升序)
 
select name,uid from user where uid between 10 and 50;
 
select name,uid from user where uid between 10 and 50 order by uid;
 
查询分组
 
sql查询 group by
 
select shell from user group by shell;
 
限制查询显示行数limit
 
sql查询 limit 数字;  显示查询结果的前几行
 
sql查询 limit 数字1,数字2;  设置显示行的范围
 
select  from user;
 
select  from user limit 2;
 
select * from user limit 2 2;          显示第2行后的2行,即(3,4两行)
 
复制表:快速备份
 
create table yyy select * from xxx;    将源表xxx复制为新表yyy(键值无法复制)
 
create table zzz
 
create database dbbak;
 
create table dbbak.user2 select  from studb.user;
 
create table dbbak.user3 select  from studb.user where 1=2;
 
create table dbbak.user4 select name,uid from studb.user limit 3;
 
多表查询
 
select 字段名列表 from 表名列表;            迪卡尔集
 
select 字段名列表 from 表名列表 where 条件;
 
create table studb.t1 select name,uid,shell from user limit 3;
 
create table studb.t2 select name,uid,homedir from user limit 4;
 
show tables
 
select  from t1;seletct  from t2;    迪卡尔集会出现12行
 
select  from t1,t2 where t1.uid=t2.uid and t1,name=t2.name;  
 
select t1.,t2.homedir from t1,t2 where t1.uid=t2.uid and t1.name=t2.name;
 
嵌套查询
 
select name from user where name not in(select user from mysql.user);
 
select name from user where name not in(select user from mysql.user where user="zhangsan");
 
连接查询
 
左连接查询
 
select 字段名列表 from 表A left join 表B on 条件;
 
右连接查询
 
select 字段名列表 from 表A right join 表B on 条件;
 
create table studb.t3 select name,uid,shell from user limit 3;
 
create table studb.t4 select name,uid,shell from user limit 5;
 
select * from t3 left join t4 on t3.uid=t4.uid;
 

 
修改表记录字段的值
 
update 库.表 set 字段名=值 where 条件;
 

 
以行为删除单位
 
delete from 库.名 where 条件;             删除指定行
 
数据库管理员root用户密码的设置
 
mysqladmin -hlocalhost -uroot -p password "新密码"
 
恢复MySQL管理密码(忘记密码时,管理员有权限更改)
 
#vim /etc/my.cnf
 
[mysqld]
 
......
 
skip-grant-tables     跳过权限
 
#systemctl restart mysqld
 
#mysql
 
mysql> update mysql.user set authentication_string=password("888888")
 
-> where user="root" and host="localhost";
 
mysql.user表内有用户登陆的信息密码记录,可更改表内记录改密码
 
mysql> flush privileges;       刷新
 
退出mysql后再修改配置文件,删除跳过权限
 
用户授权 grant
 
在数据库云服务器添加新的连接用户
 
mysql> grant 权限列表 on 库名.表名 to 用户@"客户端地址" identified by "密码" 【with grant option可加,使得新用户拥有添加用户的权限】
 
grant all on .
 
当库名.表名 为.时,匹配所有库所有表
 
授权设置放在mysql库的user表
 
grant all on . to root@"192.168.4.12" identified by "123456" with grant option;  (对192.168.4.12授权,用户root,密码123456)
 
数据库云服务器IP为192.168.4.11
 
新建虚拟机mysql12,IP为192.168.4.12
 
客户端测试授权:
 
#which mysql
 
#yum -y install mariadb
 
mysql>  -h数据库云服务器的IP地址 -u用户名 -p密码
 
mysql> select @@hostname;   查看当前登陆的数据云服务器
 
mysql> select user();      查看当前正在访问的终端
 
mysql> show grants;         查看自己的权限
 
允许从网站云服务器上使用bbsuser用户连接,密码是123456,只对bbsdb库下的所有表有完全权限,没有授权权限
 
grant all on bbsdb.* to bbsuser@"192.168.4.30" identified by "123456";
 
只有192.168.4.30可使用用户bbsuser登陆,在数据库中只能对bbsdb库进行增删改。
 
grant select on . to admin@"localhost" identified by "123456";
 
本机用户admin只拥有读权限
 
管理员查看其他用户权限
 
show grants for 用户名@客户端地址
 
权限撤销 revoke
 
mysql> revoke 权限列表 on 库名.表名 from 用户名@客户端地址;
 
撤销记录信息
 
revoke delete,update on . from 用户名@客户端地址;
 
删除授权用户drop user 用户名@客户端地址
 
use mysql;
 
show tables;
 
user    已有授权用户信息
 
db      授权用户对库的访问权限
 
数据备份
 
1 为什么要备份数据?
 
数据丢失或误删除时,使用备份文件恢复数据。
 
2 数据备份方式?
 
物理备份? 备份库或表对应文件
 
cp  -r /var/lib/mysql/mysql     /opt/mysql.bak
 
cp    /var/lib/mysql/mysql/user.*   /opt/
 
tar  -zcvf  /opt/mysql.tar.gz   /var/lib/mysql/mysql/*
 
164  cp  -r /mydata/mysql.bak/  /var/lib/mysql/mysql
 
165  chown -R mysql:mysql /var/lib/mysql/mysql
 
166  systemctl  restart mysqld
 
逻辑备份?备份时根据已有的库表及记录生成对应的sql命令,把
 
sql保存到指定的备份文件里
 
3数据备份策略?
 
完全备份   备份所有数据(一台云服务器   一个库    一张表)
 
差异备份   备份自完全备份后所有新产生
 
增量备份   备份自上一次备份后所有新产生
 
完全备份+差异备份
 
完全备份+增量备份
 
4在生成环境下如何实现数据备份
 
周期性计划任务 执行 备份脚本
 
00  18         1   sh  /shell/allbak.sh
 
5 数据备份时要考虑因素?
 
备份方式  逻辑备份
 
备份策略 ?完全 差异  增量
 
数据备份频率?  1 小时   1天    1周
 
数据备份的时间?  数据访问量小的时候执行备份
 
存储空间可扩展?  LV
 
备份文件命名要有标识性? 使用日期做备份文件名
 
完全备份
 
#mysqldump  -hlocalhost   -uroot   -p123qqq    数据库名
 
目录名/名.sql
 
数据库名的表示方式?
 
--all-databases  备份一台服务上的所有数据
 
数据库名              备份一个库里的所有表
 
数据库名  表名     备份一张表里的所有数据
 
-B 数据库名1 数据库名2  数据库名N   备份某几个库的所有数据
 
#mkdir  /databak
 
#mysqldump -uroot -p123qqq userdb >
 
/databak/userdb.sql
 
#mysqldump -uroot -p123qqq teadb >
 
/databak/teadb.sql
 
完全恢复
 
#mysql  -hlocalhost  -uroot  -p123qqq    数据库名  <  目录
 
名/名.sql
 
mysql>drop database  teadb;
 
mysql>create database  teadb;
 
#mysql -uroot -p123qqq teadb < /databak/teadb.sql
 
mysql> use teadb ; show tables;
 
#crontab  -e
 
00  18          1      /opt/teadbbak.sh   &> /dev/null
 
00  18          2-7  /opt/baknewbinlogfile.sh
 
vim /opt/baknewbinlogfile.sh
 
#!/bin/bash
 
备份每天新生成的binlog日志文件且正在使用的binlog日志文
 
件不备份
 
:wq
 
vim /opt/teadbbak.sh
 
#!/bin/bash
 
if [  !  -e /databak  ];then
 
mkdir   /databak
 
fi
 
day=date  +%F
 
mysqldump   -uroot  -p123qqq  --flush-logs  teadb   >
 
/databak/teadb-${day}.sql
 
:wq
 
chmod  +x  /opt/teadbbak.sh
 
只使用完全备份策略备份数据的缺点:
 
a 使用完全备份文件恢复数据时只能把数据恢复到备份时的状态
 
,完全备份新产生的数据无法恢复。
 
b 备份和恢复数据时都会对表加写锁。
 
+++++++++++++++++++++++++++++++++++二
 
、增量备份(启用mysql服务binlog日志做时时增量备份、安装
 
第3方软件提供增量备份命令做备份)
 
2.1启用mysql服务binlog日志做时时增量备份
 
binlog日志  又叫二进制日志  ,是mysql数据服务日志文件的
 
一种,记录客户端连接数据库服务后,执行的除查询之外的sql
 
命令。
 
mysql  -hx.x.x.x   -uroot  -p123456
 
mysql>  select    desc    show  tables  
 
mysql> create     insert    update    delete   grant   revoke
 
启用binlog日志
 
mysql > show variables like "binlog_format";
 
vim  /etc/my.cnf
 
[mysqld]
 
server_id=12
 
log_bin
 
binlog_format="mixed"
 
:wq
 
#systemctl   restart  mysqld
 
mysql > show variables like "binlog_format";
 
ls  /var/lib/mysql/主机名-bin.000001      500M+
 
ls /var/lib/mysql/localhost-bin.index     索引文件
 
查看binlog日志文件内容
 
#mysqlbinlog  /var/lib/mysql/localhost-bin.000001
 
binlog日志文件记录sql命令的方式?
 
时间点
 
--start-datetime="yyyy-mm-dd  hh:mm:ss"
 
--stop-datetime="yyyy-mm-dd  hh:mm:ss"
 
pos点
 
--start-position=数字    
 
--stop-position=数字
 
执行binlog日志里的sql命令恢复数据
 
#mysqlbinlog  [选项]  日志文件名  |  mysql  -uroot  -
 
p123qqq
 
#mysqlbinlog   --start-position=300   --stop-
 
position=1006   /var/lib/mysql/localhost-bin.000001  |
 
mysql  -uroot  -p123qqq
 
手动生成新的binlog日志?
 
mysql> flush  logs;
 
mysql -uroot -p123qqq -e "flush logs"
 
systemctl  restart mysqld
 
#mysqldump -uroot -p123qqq --flush-logs  teadb  t7  >
 
/databak/t7.sql
 
删除已有的binlog日志文件
 
mysql> reset  master;
 
mysql> purge  master  logs  to  "binlog文件名";
 
#rm  -rf   binlog日志文件
 
自定义binlog日志文件存储的目录和文件名
 
mkdir /logdir
 
chown  mysql /logdir
 
setenforce  0
 
#vim /etc/my.cnf
 
server_id=12
 
#log_bin
 
log_bin=/logdir/plj
 
binlog_format="mixed"
 
:wq
 
#systemctl  restart  mysqld
 
#ls  /logdir/
 
++++++++++++++++++++++++++++
 
2.3安装第3方软件percona提供增量备份命令做备份
 
一款强大的在线热备份工具
 
备份过程中不锁库表,适合生产环境
 
由专业组织Percona提供(改进MySQL分支)
 
主要含两个组件
 
xtrabackup:C程序,支持InnoDB/XtraDB
 
innobackupex:以Perl脚本封装xtrabackup,还支持
 
MyISAM
 
#yum -y  install  perl-DBD-MySQL   perl-Digest-MD5
 
#rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
 
rpm -ivh  percona-xtrabackup-24-2.4.7-
 
1.el7.x86_64.rpm
 
rpm -qa  | grep  percona
 
rpm -ql percona-xtrabackup-24
 
#man  innobackupex
 
#man  xtrabackup
 
#innobackupex   <选项>
 
1 innobackupex完全备份与恢复
 
#mkdir  /pljdir
 
innobackupex --user root  --password 123qqq  --
 
databases="teadb"  /pljdir   --no-timestamp
 
innobackupex  --user root --password  123qqq  --
 
databases="teadb"    --apply-log    /pljdir
 
完全恢复
 
cp  -r  /var/lib/mysql/mysql  /opt/mysql.bak
 
#rm  -rf /var/lib/mysql
 
#mkdir /var/lib/mysql
 
innobackupex  --user root --password 123qqq   --
 
databases="teadb" --copy-back  /pljdir
 
cp -r /opt/mysql.bak  /var/lib/mysql/mysql
 
chown  -R mysql:mysql /var/lib/mysql
 
#systemctl  restart mysqld
 
备份目录下配置文件说明
 
backup-my.cnf
 
xtrabackup_checkpoints
 
xtrabackup_logfile
 
ibdata1
 
数据库 /var/lib/mysql/
 
事务日志文件
 
lsn  日志序列号
 
ib_logfile0
 
ib_logfile1
 
ibdata1
 
重新初始化数据库目录下的初始数据
 
#systemctl  stop mysqld
 
#rm  -rf /var/lib/mysql
 
vim /etc/my.cnf
 
[mysqld]
 
#validate_password_policy=0
 
#validate_password_length=6
 
:wq
 
#mysql_install_db   --datadir=/var/lib/mysql   --
 
user=mysql
 
#ls /var/lib/mysql/
 
#rm -rf   /var/lib/mysql/mysql
 
#cp  -r  /opt/mysql.bak   /var/lib/mysql/mysql
 
#chown  -R mysql:mysql   /var/lib/mysql/mysql
 
#systemctl  start mysqld
 
2 innobackupex增量备份
 
完全备份 db101.t1  4---999
 
#innobackupex  --user root  --password  123456  --
 
databases="db101.t1"   /fullbak   --no-timestamp
 
第1次增量备份  8888
 
#innobackupex  --user root  --password  123456  --
 
databases="db101.t1"  --incremental   /new1dir   --
 
incremental--basedir=/fullbak   --no-timestamp
 
第2次增量备份  7777
 
#innobackupex  --user root  --password  123456  --
 
databases="db101.t1"   --incremental   /new2dir   --
 
incremental--basedir=/new1dir  --no-timestamp
 
增量恢复步骤
 
1 rm  -rf  /var/lib/mysql/
 
2 恢复日志信息
 
3 恢复数据
 
4 重启数据库服务
 
5 登录查看
 
增量恢复步骤
 
1 rm  -rf  /var/lib/mysql/
 
2 mkdir  /var/lib/mysql
 
2 恢复日志信息
 
#innobackupex --user root --password 123456 --
 
databases="db106.t1" --apply-log --redo-only  /onedir
 
#innobackupex --user root --password 123456 --
 
databases="db106.t1"  --apply-log --redo-only /onedir
 
--incremental-dir="/dir2"
 
#innobackupex --user root --password 123456 --
 
databases="db106.t1"  --apply-log --redo-only /onedir
 
--incremental-dir="/dir3"
 
3 恢复数据
 
#innobackupex --user root --password 123456 --
 
databases="db106.t1" --copy-back   /onedir
 
4 重启数据库服务
 
#cp  -r  /root/mysql.plj   /var/lib/mysql/mysql
 
#systemctl start mysqld
 
#chown  -R  mysql:mysql   /var/lib/mysql
 
#systemctl  stop  mysqld
 
#systemctl   start  mysqld
 
5 登录查看
 
mysql -uroot  -p123456
 
mysql> select  * from db1.t1;
 
+++++++++++++++++++++++++++++++
 
3 使用完全备份文件恢复某个表的记录。
 
db106.a/b/t1
 
完全备份
 
#innobackupex  --user  root  --password  123456   --databases="db106"    /db106all   --no-timestamp
 
#ls /db106all
 
#mysql  -uroot  -p123456
 
#drop table   db106.a;
 
恢复某个表的记录
 
#innobackupex --user root --password 123456 --databases="db106" --apply-log --export    /db106all
 
#ls   /db106all/a.*
 
mysql> create  table db106.a(id int);
 
mysql> alter  table  db106.a  discard  tablespace;
 
mysql> system cp  /db106all/db106/a.{ibd,cfg,exp} /var/lib/mysql/db106/
 
mysql> system  chown mysql:mysql /var/lib/mysql/db106/a.*
 
mysql> alter  table  db106.a  import  tablespace;  
 
mysql > select  * from  db106.a;
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章