Mysql通过读取txt文件来更新表



/var/lib/mysql-files/myfile.txt文件包含

23/08/2020 mycluster1 192.168.0.10 1515G 22G 1493G 2 15 17

我想通过读取/var/lib/mysql-files/myfile.txt来更新服务器检查表。我尝试了很多组合,但找不到合适的解决方案。我还搜索了导入命令,但找找不到更新

mysqlimport -u myuser -pxxXxX1xF databasename UPDATE 'servercheck' (`id`, `date`, `cluster`, `ip`, `totalsize`, `used`, `available`, `-10MBfiles`, `+10MBfiles`, `totalfiles`) VALUES LOAD_FILE('/var/lib/mysql-files/myfile.txt') Where ip='192.168.0.10';

如何更新此表?

感谢堆

如果需要的话,这就是脚本。

srvstat.txt

a=Australia b=04/09/2020 15:40 c=strg1-au.myserver.com d=192.168.0.15 e=/etc/mydata/ f=147G g=1G h=1% i= 147G j=99% k=0 l=0 m=0 n=OK o=OK p=32547320 KB r=27402 MB s=500G t=494G

这个php代码读取并更新表。

<?php
$input = "/etc/system/srvstats/storage/srvstats.txt";
$dbHost = "localhost";
$dbUser = "myuser";
$dbPass = "xxxxxxxxxxF";
$db = "admin_my2";
$table = "storagecheck";
$id = "2";
$data = explode('=', file_get_contents($input));
$location = trim(substr($data[1], 0, -2));
$date = trim(substr($data[2], 0, -2));
$cluster = trim(substr($data[3], 0, -2));
$ip = trim(substr($data[4], 0, -2));
$mounted = trim(substr($data[5], 0, -2));
$totalsize = trim(substr($data[6], 0, -2));
$used = trim(substr($data[7], 0, -2));
$usedPercent = trim(substr($data[8], 0, -2));
$free = trim(substr($data[9], 0, -2));
$freePercent = trim(substr($data[10], 0, -2));
$minus50MBFiles = trim(substr($data[11], 0, -2));
$plus50MBFiles = trim(substr($data[12], 0, -2));
$totalFiles = trim(substr($data[13], 0, -2));
$pinggateway = trim(substr($data[14], 0, -2));
$raidhealth = trim(substr($data[15], 0, -2));
$memorysize = trim(substr($data[16], 0, -2));
$freememory = trim(substr($data[17], 0, -2));
$backupsize = trim(substr($data[18], 0, -2));
$backupspaceremaining = trim($data[19]);
$conn = new mysqli($dbHost, $dbUser, $dbPass, $db);
!$conn->connect_error OR die("Connection failed: " . $conn->connect_error);
$sql = "UPDATE `$table` SET `location` = '$location', `date` = '$date', `cluster` = '$cluster', `ip` = '$ip', `mounted` = '$mounted', `totalsize` = '$totalsize', `used` = '$used', `used%` = '$usedPercent', `available` = '$free' , `free%` = '$freePercent', `-50MBfiles` = '$minus50MBFiles',`+50MBfiles` = '$plus50MBFiles',`totalfiles` = '$totalFiles',`pinggateway` = '$pinggateway', `raidhealth` = '$raidhealth', `memorysize` = '$memorysize', `freememory` = '$freememory', `backupsize` = '$backupsize', `backupspaceremaining%` = '$backupspaceremaining' WHERE `id` = $id";
$conn->query($sql);
echo "Entry ID $id updated succesfully.";

无论如何,继续尝试随机的语法组合。你快到了!你只有2562270211004081333608191283618380258053564283574041926650208557721188227265041451752779947834884007747943069000615135250963344833331485320251677534098797378129631890777593821450771100601040658154732825998434179861242822823294569561935370384214295397821780452001056446731902062784801234354,5673438371561492304513028481819756980289887423374669176537618820521145178223098176698410689383911567122674140652021361126938077211645670335754798572837522127251808079506645292614358663558959609374更多组合可供尝试。

(这是95251,长度为251的字符串数,由95个可打印的ASCII字符组成。上面显示的示例为减1。(

嗯。当我们这样想的时候,也许";尝试每种组合";不是编写代码的最佳方式。

阅读mysqlimport工具的文档。它不支持自定义UPDATE语句。

您可以将文本数据行导入到表中。一行文本数据对应于表中的一行。

默认情况下,该行将作为新行插入。您也可以使用--replace选项,这样,如果文本中的值与表的主键或唯一键冲突,文本行将替换现有行

这是覆盖数据的唯一可能性。表中必须有主键或唯一键,并且该主键或唯一密钥中的值必须与导入的文本文件的相应列中的值冲突。否则,MySQL就无法知道要替换哪一行。

如果您想要其他方式来匹配行(即不是主键或唯一键(,或者如果您想要覆盖某些列而不是其他列,那么您应该将文本数据导入到新的表中,然后您可以执行任何SQL查询,以便将新导入的行与原始表中的行进行匹配,并覆盖某些列。

另一个解决方案是忘记使用mysqlimport,而是用你喜欢的语言编写一个脚本(我会使用python,但任何语言都可以(,逐行读取文本文件,并逐行发出SQL语句来更改表中的行。您可以使用UPDATE,也可以使用INSERT。。。关于复制密钥更新,取决于你想做什么。

最新更新