在客户现场遇到的数据库问题,及方案处理
问题1、通过接口写入数据库未成功
描述:由第三方提供接口,我从接口接入数据到数据库后,再从数据库拿出来数据传到另一平台上。
(1)从数据库拿数据到平台,接口是否正常?正常。
(2)从第三方拿数据写入到数据库,接口是否正常?不正常,显示某应用系统长度过长。
解决方案:延长字符长度
(1)到数据库中查询此表,如表名t1,连接数据库后desc t1;可以看到字段以及类型,如下所示,SYSTEM_NAME为char(124)。
mysql> desc t1;
+-----------------+-----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-----------+------+-----+---------+-------+
| SYSTEM_NAME_OLD | char(180) | YES | | NULL | |
| SYSTEM_CODE | char(255) | YES | | NULL | |
| NUM | int(11) | YES | | NULL | |
| SYSTEM_NAME | char(124) | YES | | NULL | |
+-----------------+-----------+------+-----+---------+-------+
4 rows in set (0.00 sec)
(2)将类型char(124)增至char(1024)。—直接改风险有些大,可能先备份,再修改。
先说下直接增加字段长度的。
mysql> alter table t1 change SYSTEM_NAME SYSTEM_NAME VARCHAR(1024)
-> ;
Query OK, 2 rows affected (0.22 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> desc t1;
+-----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+-------+
| SYSTEM_NAME_OLD | char(180) | YES | | NULL | |
| SYSTEM_CODE | char(255) | YES | | NULL | |
| NUM | int(11) | YES | | NULL | |
| SYSTEM_NAME | varchar(1024) | YES | | NULL | |
+-----------------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
./mysqldump -umysql -pMysql@123 test123 t1 > /mysqltest/test/t1.sql;
alter table t2 change SYSTEM_NAME SYSTEM_NAME VARCHAR(1024)
select distinct SYSTEM_CODE from t1;
select NUM from t1 group by SYSTEM_CODE having count(*)>1;
insert into t2(SYSTEM_NAME_OLD,SYSTEM_CODE,NUM,SYSTEM_NAME) values ("应用系统4","ABCD",4,null)
select NUM from t1 group by SYSTEM_CODE having count(*)>1;
select NUM from t1 group by SYSTEM_CODE='ABCD' having count(*)>1;
insert into t2(SYSTEM_NAME_OLD,SYSTEM_CODE,NUM,SYSTEM_NAME) values ("应用系统5","ABCDE",5,null);
问题2、库迁移,核对数据库表的大小
./mysqldump -umysql -p -P3306 -S /mysqldata/3306/socket/mysql.sock
库迁移后,不确定数据是否准确,表的数量虽然一致,但还是想从数据方面查看。
SELECT table_schema AS "Database",SUM(data_length+index_length)/1024/1024/1024 AS "Size(GB)" FROM information_schema.TABLES WHERE table_schema="db_vmdb";
SELECT table_schema AS "Database",SUM(data_length+index_length)/1024/1024 AS "Size(MB)" FROM information_schema.TABLES WHERE table_schema="db_vmdb";
问题3、got errno 28 on write
正在备份mysql数据文件,报错got errno 28 on write。
./mysqldump -uroot -p -P3306 -S /mysqldata/3306/socket/mysql.sock --skip-disable-keys --skip-add-locks --set-gtid-purged=OFF --master-data=2 --databases db_vmdb > /home/appadmin/db_vmdb.sql
此时会让输入密码,Enter password:
输入密码后回车,他就运行正在往指定路径/home/appadmin/备份db_vmdb.sql文件,但稍后报了个got errno 28 on write。
后来才知道是因为空间不足导致,就是/home/appadmin这个空间已经满了,还弄了个高级告警,属于极为严重的生产事件!所以在备份库的时候,首先要确认库的大小,然后确认目录空间大小,确保能包得住的情况下再备份!!!希望这个问题大家都不会碰到!
问题4、无法将查询结果导出,用命令截取数据复制出来
从sys_tran表中第10行开始查询,查100行,返回结果为:app_code字段、app_name字段和describe字段左侧前100个字符。
结构:select A字段,B字段,left(C字段,100) from 表明 limit n从第几行查,要返回多少条数据;
select app_code,app_name,left(describe,100) from sys_tran limit 10,100;
问题5、生产与测试字段差异
字段不同
查询方法
(1)desc test1;
可以看test1表中的字段结构
(2)show create table test1;
可以看创建test1表的语句。
发现差异后的解决方法
少字段,增加字段。
(1)alter table test1 add column column
decimal(16,0) after id
;
(2)alter table test2 add column column1
decimal(16,0), add column column
decimal(16,0);