xml地图|网站地图|网站标签 [设为首页] [加入收藏]
常见命令语句,mysqldump备份表中有大字段失败的
分类:数据库

1 下载并安装MySQL官方的 Yum Repository

  //下载安装Yum Repository

  wget -i -c

  //yum安装      

  yum -y install mysql57-community-release-el7-10.noarch.rpm

  //开始安装MySQL服务器

  yum -y install mysql-community-server

#---------------------------
#----cmd命令行连接MySql---------

       几天前收到某个业务项目,MySQL数据库逻辑备份mysqldump备份失败的邮件,本是在休假,但本着工作认真负责,7*24小时不间断运维的高尚职业情操,开始了DBA的排错之路(一开始数据库的备份都是成功的,巧的是我休假就出问题,怀疑是数据量又有增长)

2 MySQL数据库设置

  //首先启动MySQL

  systemctl start mysqld.service

  //查看MySQL运行状态

  systemctl status mysqld.service

  结果成功的话如图

  澳门新葡亰手机版 1

  //此时MySQL已经开始正常运行,不过要想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码

  grep "password" /var/log/mysqld.log

  结果:最后面的为初始密码

  澳门新葡亰手机版 2

  //进入数据库

  mysql -uroot -p
  
  //此时不能做任何事情,需要先修改密码

  ALTER USER 'root'@'localhost' IDENTIFIED BY '你想的密码';

  //这样设置密码需要设置复杂一点的密码,否则会报错,若想设置简单的密码如123456,可以如下配置
  
  set global validate_password_policy=0;

  set global validate_password_length=1;

  //之后再设置密码
  

  ALTER USER 'root'@'localhost' IDENTIFIED BY '你想的密码';

  //但此时还有一个问题,就是因为安装了Yum Repository,以后每次yum操作都会自动更新,需要把这个卸载掉:

  //先退出mysql

  quit;

  yum -y remove mysql57-community-release-el7-10.noarch

 

  

 

 

   

 

 

  

 

       首先我们了解下mysqldump备份,数据流向的一个过程:MySQL Server端从数据文件中检索出数据,然后分批将数据返回给mysqldump客户端,然后mysqldump再把数据写入到NFS上。一般情况下存储不是SSD或者是普通磁盘,那么向NFS上写入数据比Server端检索完数据发送给mysqldump客户端要慢得多,这就有可能mysqldump无法及时接收MySQL Server端发送过来的数据,导致Server端检索出来的数据在内存中积压等待发送。当超过等待的时间net_write_timeout(默认60s)时就连接断开,同时抛出错误。

cd  C:Program FilesMySQLMySQL Server 5.5bin

 1、定位问题

 

       登录到机器上,先查看了备份文件的逻辑,再查看备份的日志和备份文件大小,确认备份失败并定位到是备份命令mysqldump行执行一半失败(根据备份文件较之前的几天减少了一半且脚本运行日志来断定)。凌晨的备份无效,因而手动触发脚本执行备份,发现了报错如下:

# 启动mysql服务器
net  start  mysql

[root@mysql_query hk_sa]# bash /opt/shells/mysqldump.sh    
Warning: Using a password on the command line interface can be insecure.
mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `rrd_api_log` at row: 2821866

 

2、排查问题

# 关闭mysql服务器
net  stop  mysql

      查看备份失败的表的行数为4982704,查看手动备份失败处的行信息是2017-02-05 04:03:18写入,之前都没有出现过这个备份失败的问题。于是开始怀疑是不是最近数据增长太大或者表的字段太宽的问题(其他数据库的表更大,有的甚至达到400G也没有出现过这个问题,表数据量太大的可能性不大,但单行备份失败,怀疑大字段的问题)

 

      查看表结构如下:

# 进入mysql命令行 

[root@localhost] | 08:42:21 | [heika0516] > desc rrd_api_log;
+---------------+-------------+------+-----+---------+----------------+
| Field         | Type        | Null | Key | Default | Extra          |
+---------------+-------------+------+-----+---------+----------------+
| id            | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| api_command   | varchar(30) | NO   |     | NULL    |                |
| request_info  | text        | NO   |     | NULL    |                |
| response_info | text        | NO   |     | NULL    |                |
| create_time   | datetime    | NO   |     | NULL    |                |
+---------------+-------------+------+-----+---------+----------------+
5 rows in set (0.01 sec) 

mysql  -h  localhost  -u  root  -p

     方向定了剩下的就是验证自己的猜想了,于是我开始查找资料,果然被我百度到了一些有价值的东西,包括MySQL官方的一些说法:

 #---------------------------

     然而新的问题又出来了,很多前辈都讲增大net_write_timeout的值,Server端会消耗更多的内存甚至导致swap的使用影响性能,但又不确定是不是参数调整所致,存在潜在的风险。不过这种说法我并不同意,因为我执行的过程中发现,MEM的free反而变多了,你没有听错真的变多了。

#----MySql用户管理---------

#mysqldump备份执行前
[root@mysql_query hk_sa]# free -m
             total       used       free     shared    buffers     cached
Mem:         16080      13305       2775          0        121       3729
-/+ buffers/cache:       9454       6626
Swap:         8191        349       7842

#增大了net_write_timeout的值
[root@localhost] | 08:51:53 | [(none)] > set @@global.net_write_timeout=500;
Query OK, 0 rows affected (0.01 sec)

#bash完脚本发现备份OK的
[root@mysql_query hk_sa]# ls -lh /opt/app/mysql/data/heika0516/rrd_api_log.ibd 
-rw-r--r-- 1 mysql mysql 4.1G Aug  7 22:03 /opt/app/mysql/data/heika0516/rrd_api_log.ibd

#mysqldump备份执行后
[root@mysql_query hk_sa]# free -m
             total       used       free     shared    buffers     cached
Mem:         16080      12434       3646          0         93       2890
-/+ buffers/cache:       9450       6630
Swap:         8191        349       7842

#修改密码:首先在DOS 下进入mysql安装路径的bin目录下,然后键入以下命令:

  到此为止,mysqldump备份失败确实是解决,但是前辈们反映的问题是消耗更多的内存,到我这反而释放了更多的内存,这样修改参数终究是会存在安全隐患,且这个参数会影响所有的会话连接。那就先不管了,过个好假期再搞。不过我始终有个疑问,我这维护的400G的大表,且部分表比这更大,也有大字段就没出现过这个问题,怎么会突然出现呢,因此我怀疑不是表数据过多的问题,还是大字段的问题。

mysqladmin -uroot -p123 password 456;

       休假回来后,立马开始test排错的工作,先分析确认好切入点,我就把net_write_timeout的值改为默认60,但这样备份肯定会失败的,于是想到了max_allowed_packet参数,但全局调整这个参数,对网络发包和各个会话也有影响,继续对mysqldump这个备份进行调研,居然让我发现了一个牛逼的可接参数max_allowed_packet,在mysqldump后面加了这个选项,值大小大家可以根据表的大小进行设置,我这里给的500M,至此问题彻底解决了,也没有改变参数的全局值影响会话。

*#增加用户*

**#格式:grant 权限 on 数据库.*澳门新葡亰手机版, to 用户名@登录主机 identified by '密码'**

***/****

**如,增加一个用户user1密码为password1,让其可以在本机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:**

*grant select,insert,update,delete on *.* to user1@localhost Identified by "password1";*

**如果希望该用户能够在任何机器上登陆mysql,则将localhost改为"%"。**

***如果你不想user1有密码,可以再打一个命令将密码去掉。***

**grant select,insert,update,delete on mydb.* to user1@localhost identified by "";**

**/*

**grant all privileges on wpj1105.* to sunxiao@localhost identified by '123'; #all privileges 所有权限**

 

#----------------------------

#-----MySql数据库操作基础-----

 

# 创建数据库

create  database   namage  default  character  set  utf8  collate  utf8_general_ci;

# 如果数据库存在删除

drop  database  if  exists  manage;

 

# 进入数据库

use  manage;

# 删除数据库

drop  manage;

# 查看表的结构

desc  class;

# 查看表内数据

select  *   from  class;

 

# 创建班级表并添加字段:
create  table  class(
id  int(10)  not  null  auto_increment,
name  varchar(30)  not  null  default  " noname",
add_time  datetime  no t null,
primary  key(id)
)
ENGINE = INNODB  charset=utf8;

 

# 1、向表内添加2条数据:如果 add_time 字段为datetime
insert into class(name,add_time) values ("一年级","2018-08-31 15:33");
insert into class(name,add_time) values ("二年级","2018-08-31 15:33");

 

# 2、向表内添加2条数据:如果 add_time 字段为timestamp

insert into class(name) values ("一年级");

insert into class(name) values ("二年级");

 

# 创建学生表并添加字段:
CREATE table student(
id  int(10)  not  null  primary  key  auto_increment  unique,    #  unique唯一性,不可重复
name  varchar(30)  not  null  default  "noname "   comment   "名称",
age  int(10)  not  null  default  0  comment   "年龄",
birthday  datetime  not  null  comment  "生日",
class_id  int(10) ,
foreign  key(class_id)  references  class(id)
);

# 向表内添加4条数据:
insert into student(name,age,birthday,class_id) values ("卢宇蒙",23,"1996-07-11",1);
insert into student(name,age,birthday,class_id) values ("王志敏",23,"1996-08-12",1);
insert into student(name,age,birthday,class_id) values ("赵广正",23,"1996-09-13",2);
insert into student(name,age,birthday,class_id) values ("古川",23,"1996-10-14",2);

 

# 创建分数表并添加字段: decimal(5,2) 5是有效长度,2是小数点后2位
create  table  course(
id  int (10)  not  null  primary  key  auto_increment,
name  varchar(30)  not  null ,
score  DECIMAL(5,2)  not  null,
class_id  int(10)  not  null,
stu_id  int (10)  not  null,
foreign  key(class_id)  references  class(id),
foreign  key (stu_id)  references  student(id)
);

# 向表内添加5条数据:
insert into course(name,score,class_id,stu_id) values ("数学",90.6,1,1);
insert into course(name,score,class_id,stu_id) values ("语文","135.44",1,5);
insert into course(name,score,class_id,stu_id) values ("英语","100",2,3);
insert into course(name,score,class_id,stu_id) values ("政治","98",1,2);
insert into course(name,score,class_id,stu_id) values ("历史","89.92",2,4);

完成后如图所示:

 

 

 

# 查找三张表里所有的数据:
SELECT * FROM student;
SELECT * FROM class;
SELECT * FROM course;

 

# 查询student表中id=1的name名

select  name  from  student  where  id=1;

# 查询student表中name=“王志敏”的数据

select * from student where name = "王志敏";

本文由澳门新葡亰手机版发布于数据库,转载请注明出处:常见命令语句,mysqldump备份表中有大字段失败的

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文