使用awk输出来运行mysqldump

时间:2013-12-06 22:27:25

标签: linux bash shell awk

我正在尝试了解有关shell脚本的更多信息,如果有人愿意教育/批评特别使用 awk ,请将其拼凑在一起。因为它基于执行查询的每个值,这是一个可行的选择吗?有没有更好的方法,即。 for或while循环?

timestamp = $(date "+%Y=%m-%d %H:%M:%S")

user_dir = "server_dir_name"

backup_path = "/home1/$user_dir/public_html"

local_bckup_store = "/home1/$user_dir/backups"

db_prefix = "database_prefix"

db_user = "database_username"

db_pwd = "database_user_password" //used here for simplicity, not security

tar -zcvf "$local_bckup_store/$user_dir-public_html-$timestamp.tar.gz" $backup_path

mysql -NBr -u$db_user -p$db_pwd -Dinformation_schema -e "SELECT schema_name FROM schemata WHERE schema_name LIKE '/$db_prefix_%/"';"
| awk  '{ system("mysqldump -u$db_user -p$db_pwd $1 > $local_bckup_store/$1.$timestamp.sql | gzip" $1) }'

我将解决存储* $ db_pwd *的安全问题,即使它将在服务器上本地存储和运行,但是会对最佳实践的一些输入表示赞赏。

感谢。

3 个答案:

答案 0 :(得分:1)

你真的只是使用awk来获取从mysql语句返回的第一个参数。

我建议将该参数保存在变量中,然后用它做你想做的事。

更新示例(我认为这就是你想要的):

e.g。

while read schema_name ; do
  backup_file=${local_bckup_store}/${schema_name}.${timestamp}.sql
  mysqldump -u${db_user} -p${db_pwd} ${schema_name} > ${backup_file}
  gzip ${backup_file}
done < `mysql -NBr -u${db_user} -p${db_pwd} -Dinformation_schema -e "SELECT schema_name FROM schemata WHERE schema_name LIKE 'db_prefix_%';" | awk '{ print $1 }'`

注意反引号,它运行命令并返回STDOUT文本,该文本将输入“while read”行的STDIN。另外,我将shell变量名称放在括号中,这也是一种很好的做法,可以防止它们被错误地插入。

这样,你就可以避免awk为了运行mysqldump命令而执行另一个shell而且你的代码[稍微]更容易维护。作为额外的好处,您可以在调用mysqldump之前添加错误检查以确保mysql命令成功。

此外,我建议使用'cut'而不是'awk'来实现这一点,对于你想做的事情来说,它会更有效率。

仅供参考,您也可以将mysqldump的STDOUT直接发送到gzip的STDIN中,如下所示:

mysqldump -u${db_user} -p${db_pwd} ${schema_name} | gzip > ${backup_file}.gz

答案 1 :(得分:0)

这是一个好主意,但你真的没有做足够的文本解析保证awk,你可以用bash这样做。

query = "SELECT schema_name FROM schemata WHERE schema_name LIKE 'db_prefix_%';"
mysql -NBr -u$db_user -p$db_pwd -Dinformation_schema -e $query | while read line
do
    arr=($line)
    mysqldump -u$db_user -p$db_pwd ${arr[0]} > $local_bckup_store/${arr[0]}.$timestamp.sql && gzip $local_bckup_store/${arr[0]}.$timestamp.sql
done

bash将通过在空格上为您分割字符串来创建数组(这是arr=($line)的点)。

答案 2 :(得分:0)

这个awk命令有问题:

awk '{ system("mysqldump -u$db_user -p$db_pwd $1 > $local_bckup_store/$1.$timestamp.sql | gzip" $1) }'

因为awk不能像单引号那样使用shell变量$db_user等。要将shell变量传递给awk,请使用以下语法:

awk -v $db_user="$db_user" -vdb_pwd="$db_pwd" ts="$timestamp" '{ 
system("mysqldump -udb_user -pdb_pwd " $1 " > $local_bckup_store/" $1 "." ts ".sql | gzip" $1) }'

PS:你mysqldump | awk在这里未经测试。

另一种选择是直接在shell中执行:

schema=$(mysql -NBr -u$db_user -p$db_pwd -Dinformation_schema -e "SELECT schema_name FROM schemata WHERE schema_name LIKE 'db_prefix_%';")

mysqldump -u$db_user -p$db_pwd "$schema" > "$local_bckup_store/$schema.$timestamp.sql"