从mysql中的视图转储数据

时间:2010-11-24 08:57:17

标签: mysql mysqldump

我有一个视图,并希望将其数据提取到一个具有create table语句和数据的文件中。 我知道mysqldump不适用于视图。

3 个答案:

答案 0 :(得分:9)

显然,没有一种自动生成不存在的表的CREATE TABLE语句的方法。所以你基本上有两个选择:

  1. 创建一个实际的表,然后将其转储并删除。
  2. 编写大量代码来分析视图和基础表,并生成相应的SQL。
  3. 第一个选项根本不是最优选,但它很容易实现:

    CREATE TABLE my_table AS
    SELECT *
    FROM my_view
    

    您现在可以使用mysqldump转储表格。当你完成了:

    DROP TABLE my_table
    

    第二个选项可以根据您的需要进行最佳选择,但它可能会变得非常复杂,并且很大程度上取决于您的实际需求和工具可用性。但是,如果性能是一个问题,您可以通过快速而肮脏的技巧将两种方法结合起来:

    CREATE TABLE my_table AS
    SELECT *
    FROM my_view
    LIMIT 1;
    
    SHOW CREATE TABLE my_table;
    

    现在,您使用自己喜欢的语言从my_view读取值并构建相应的INSERT INTO代码。最后:

    DROP TABLE my_table;
    

    无论如何,请随意解释为什么需要从视图中获取SQL代码,我们可以找到更好的解决方案。

答案 1 :(得分:2)

使用SELECT ... INTO OUTFILE创建数据转储。

答案 2 :(得分:0)

我编写了一个bash函数来导出VIEW的“结构”和数据,而不创建数据的完整副本。我在CentOS 7服务器上使用MySQL 5.6对其进行了测试。它会适当考虑带有JSON值的列和诸如“ O'Mally”之类的字符串,尽管您可能需要针对其他特殊情况对其进行进一步调整。

为了简洁起见,我没有在错误检查或其他方面使它健壮。

function export_data_from_view
{
   local DB_HOST=$1
   local SCHEMA=$2
   local VIEW=$3

   local TMP_TABLE_NAME="view_as_table_$RANDOM"

   local SQL1="
      create table $TMP_TABLE_NAME as
      (select * from $VIEW where 1=0);

      show create table $TMP_TABLE_NAME \G
   "

   # Create an empty table with the structure of all columns in the VIEW.
   # Display the structure.  Delete lines not needed.
   local STRUCT=$(
      mysql -h $DB_HOST -BANnq -e "$SQL1" $SCHEMA |
         egrep -v "\*\*\*.* row \*\*\*|^${TMP_TABLE_NAME}$" |
         sed "s/$TMP_TABLE_NAME/$VIEW/"
   )
   echo
   echo "$STRUCT;"
   echo

   local SQL2="
      select concat( 'quote( ', column_name, ' ),' )
      from   information_schema.columns
      where  table_schema = '$SCHEMA'
        and  table_name   = '$VIEW'
      order  by ORDINAL_POSITION
   "
   local COL_LIST=$(mysql -h $DB_HOST -BANnq -e "$SQL2")

   # Remove the last comma from COL_LIST.
   local COL_LIST=${COL_LIST%,}

   local SQL3="select $COL_LIST from $VIEW"
   local INSERT_STR="insert into $VIEW values "

   # Fix quoting issues to produce executeable INSERT statements.
   # \x27 is the single quote.
   # \x5C is the back slash.
   mysql -h $DB_HOST -BANnq -e "$SQL3" $SCHEMA |
      sed '
         s/\t/,/g;                    # Change each TAB to a comma.
         s/\x5C\x5C\x27/\x5C\x27/g;   # Change each back-back-single-quote to a back-single-quote.
         s/\x27NULL\x27/NULL/g;       # Remove quotes from around real NULL values.
         s/\x27\x27{/\x27{/g;         # Remove extra quotes from the beginning of a JSON value.
         s/}\x27\x27/}\x27/g;         # Remove extra quotes from the end of a JSON value.
      ' |
      awk -v insert="$INSERT_STR" '{print insert "( " $0 " );"}'

   local SQL4="drop table if exists $TMP_TABLE_NAME"
   mysql -h $DB_HOST -BANnq -e "$SQL4" $SCHEMA
   echo
}