我正在编写一个单行命令,它将所有数据库备份到各自的名称中,而不是使用在一个sql中转储所有数据库.
例如:db1保存到db1.sql,db2保存到db2.sql
到目前为止,我收集了以下命令来检索所有数据库.
mysql -uuname -ppwd -e 'show databases' | grep -v 'Database'
Run Code Online (Sandbox Code Playgroud)
我打算用awk来管它做类似的事情
awk '{mysqldump -uuname -ppwd $1 > $1.sql}'
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
我是bash的新手,所以我的想法可能是错的.
我该怎么做才能让它以各自的名义导出数据库?
更新:
好的,必须最终设法让它从下面的提示工作.
这是最后的脚本
# replace [] with your own config
# replace own dir to save
# echo doesn't work. hmm...
mysql -u[uname] -p'[pwd]' -e "show databases" \
| grep -Ev 'Database|information_schema' \
| while read dbname; \
do \
echo 'Dumping $dbname' \
mysqldump -u[uanme] -p'[pwd]' $dbname > ~/db_backup/$dbname.sql;\
done
Run Code Online (Sandbox Code Playgroud)
回声部分虽然不起作用.
我想知道mysqldump中是否有任何方法可以添加适当的create table选项[IF NOT EXISTS].有任何想法吗?
我试图运行以下命令: mysql> mysqldump --all-databases> dump.sql; 在我的本地(在我的电脑上)Mysql 5.5服务器,但我不断收到此错误:
mysql> mysqldump --all-databases > dump.sql;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'mysql
dump --all-databases > dump.sql' at line 1.
Run Code Online (Sandbox Code Playgroud) 我已成功使用转储整个MySQL数据库
mysqldump --databases
Run Code Online (Sandbox Code Playgroud)
生成一个很好的.txt文件.但是,我看不出如何一次性将整个文件读回MySQL; mysqlimport似乎一次只需要一个表.
我想问一下是否可以比较两个巨大数据库的完整数据库结构.我们有两个数据库,一个是开发数据库,另一个是生产数据库.在我们发布代码的某些部分之前,我有时忘记对生产数据库进行更改,这导致生产数据库没有相同的结构,所以如果我们发布了一些内容,我们会遇到一些错误.有没有办法比较两者,或同步?
今天我有一个非常好的想法来备份我的数据库:将转储文件放在一个git存储库中,然后在每个转储上提交,以便我有最新的副本,但可以轻松回滚到任何以前的备份.我还可以定期轻松地提取存储库的副本,以便将副本作为备份的备份保存在我自己的计算机上.这听起来很聪明.
但是,我知道聪明的解决方案有时会有根本的缺陷.我可以在git中存储mysqldump差异的哪些问题?这值得么?大多数人为了在服务器上进行多个数据库备份并在其他地方保留冗余副本而做了什么?
我使用以下命令备份我的生产数据库:
mysqldump -u root --opt --skip-extended-insert --databases my_production_db
Run Code Online (Sandbox Code Playgroud)
生成的转储文件在顶部附近有以下行:
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `my_production_db` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `my_production_db `;
Run Code Online (Sandbox Code Playgroud)
为了将数据库恢复到不同的目的地,即.my_debvelopment_db我必须打开转储文件并编辑数据库命名的位.
然后我跑:
mysql -u root -p <password> < mydumpfile
Run Code Online (Sandbox Code Playgroud)
我还没想出另一种方法.
随着数据库变大,这变得不切实际.
我错过了什么吗?不能我以某种方式指定我想要恢复数据库的位置?我需要一个不同的备份命令吗?
我正在做一些数据库的事情,我需要将一个表从一个模型复制到另一个模型,但我尝试了很多方法没有效果.这样做有什么办法吗?
我运行生产数据库的每日备份mysqldump备份(mysql版本5.1.66):
mysqldump --user=username --password=secret -C -e --create-options --hex-blob --net_buffer_length=5000 databasename > file
Run Code Online (Sandbox Code Playgroud)
我也在我的开发机器上每天恢复该数据库(mysql版本5.6.12)
mysql --user=username --password=secret databasename < file
Run Code Online (Sandbox Code Playgroud)
我收到错误:第25行的ERROR 1813(HY000):表格的表空间databasename.tablename'存在.请在IMPORT之前丢弃表空间.
我的阅读表明这是因为mysql innodb数据库需要命令:
ALTER TABLE tbl_name DISCARD TABLESPACE;
Run Code Online (Sandbox Code Playgroud)
在删除表之前运行 - 似乎删除表不足以摆脱其索引.(我的开发服务器使用innodb_file_per_table选项)
我不想使用'replace'选项,因为我可能在我的开发数据库中有数据已在生产数据库中删除.
在错误之后,表格不可读,但重新启动mysqld会修复它.
所以问题是,是否有任何mysql转储选项可以帮助解决这个问题,还是有另一种方法来导入数据,以防止错误?
提前感谢阅读.