导入非常大的SQL文件时单次提交(MySQL)

时间:2017-02-15 07:41:16

标签: mysql windows mariadb

我试图将大型SQL文件(> 2.5 Gb)恢复到Windows上的MySQL数据库中。

我无法编辑这些文件以在文件开头添加SET autocommit=0;等文本(这是改善导入时间所必需的)。

我也无法使用source,因为这会输出到屏幕(非常慢),即使文件中有任何错误,执行也会继续。 E.g:

mysql> CREATE DATABASE IF NOT EXISTS dbname;
mysql> USE dbname;
mysql> SET autocommit=0;
mysql> source file.sql;
mysql> COMMIT;

是否可以在导入仅适用于当前会话的SQL文件之前和之后运行任意命令?我已经尝试了以下两种方法,并且都没有在Windows上工作(在这两种情况下都忽略了第二个操作):

mysql -u username -p -e "SET autocommit=0;" dbname < file.sql

,或者

mysql -u username -p < initial_commands.sql < file.sql

如果可能的话,每次我都不想更改全局autocommit设置,然后必须记得将其更改回来(我也不确定这是否有效)没有最终COMMIT;)。

也许有办法使用BEGIN ... COMMIT;而不是关闭自动提交?

我对那些必须做这类事情的人的任何建议感到满意!

3 个答案:

答案 0 :(得分:3)

我的回答来晚了,但可能对将来的读者有所帮助。

我遇到了同样的问题。在阅读MySQL documentation on MySQL command options时,我发现您可以使用--init-command参数。

因此您的命令行将很简单:(-v表示冗长,是可选的)

mysql --init-command="SET autocommit=0;" -v < sql_file.sql

答案 1 :(得分:2)

(echo set autocommit = 0;&amp;&amp; type file.sql&amp;&amp; echo。&amp;&amp; echo commit;)| mysql -u username -p passwd

只需使用管道而不是输入重定向,使用 echo 作为命令,使用 echo。作为换行

答案 2 :(得分:1)

你的目标可能适得其反。也就是说,将整个负载转换为单个事务可能比递增提交更慢。

<Style x:Key="FocusVisual"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/> </ControlTemplate> </Setter.Value> </Setter> </Style> <SolidColorBrush x:Key="ComboBoxItem.ItemsviewHover.Background" Color="#1F26A0DA"/> <SolidColorBrush x:Key="ComboBoxItem.ItemsviewHover.Border" Color="#A826A0DA"/> <SolidColorBrush x:Key="ComboBoxItem.ItemsviewSelected.Background" Color="Black"/> <SolidColorBrush x:Key="ComboBoxItem.ItemsviewSelected.Border" Color="#FF26A0DA"/> <SolidColorBrush x:Key="ComboBoxItem.ItemsviewSelectedHover.Background" Color="#2E0080FF"/> <SolidColorBrush x:Key="ComboBoxItem.ItemsviewSelectedHover.Border" Color="#99006CD9"/> <SolidColorBrush x:Key="ComboBoxItem.ItemsviewSelectedNoFocus.Background" Color="Red"/> <SolidColorBrush x:Key="ComboBoxItem.ItemsviewSelectedNoFocus.Border" Color="#FFDADADA"/> <SolidColorBrush x:Key="ComboBoxItem.ItemsviewFocus.Border" Color="#FF26A0DA"/> <SolidColorBrush x:Key="ComboBoxItem.ItemsviewHoverFocus.Background" Color="#5426A0DA"/> <SolidColorBrush x:Key="ComboBoxItem.ItemsviewHoverFocus.Border" Color="#FF26A0DA"/> <Style x:Key="ComboBoxItemStyle" TargetType="{x:Type ComboBoxItem}"> <Setter Property="Background" Value="{StaticResource BrushICBlue}" /> <Setter Property="BorderBrush" Value="{StaticResource BrushICBlue}" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ComboBoxItem}"> <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsEnabled" Value="False"> <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="False"/> <Condition Property="IsMouseOver" Value="True"/> <Condition Property="IsKeyboardFocused" Value="False"/> </MultiTrigger.Conditions> <Setter Property="Background" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewHover.Background}"/> <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewHover.Border}"/> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="True"/> <Condition Property="IsMouseOver" Value="False"/> <Condition Property="IsKeyboardFocused" Value="True"/> </MultiTrigger.Conditions> <Setter Property="Background" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelected.Background}"/> <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelected.Border}"/> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="True"/> <Condition Property="IsMouseOver" Value="True"/> </MultiTrigger.Conditions> <Setter Property="Background" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelectedHover.Background}"/> <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelectedHover.Border}"/> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="True"/> <Condition Property="IsMouseOver" Value="False"/> <Condition Property="IsKeyboardFocused" Value="False"/> </MultiTrigger.Conditions> <Setter Property="Background" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelectedNoFocus.Background}"/> <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelectedNoFocus.Border}"/> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="False"/> <Condition Property="IsMouseOver" Value="False"/> <Condition Property="IsKeyboardFocused" Value="True"/> </MultiTrigger.Conditions> <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewFocus.Border}"/> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="False"/> <Condition Property="IsMouseOver" Value="True"/> <Condition Property="IsKeyboardFocused" Value="True"/> </MultiTrigger.Conditions> <Setter Property="Background" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewHoverFocus.Background}"/> <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewHoverFocus.Border}"/> </MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> 表示需要为潜在的set autocommit=0记录所有插入(和其他写入)(直到commit)。首先,常规日志记录机制可以进行一堆写操作。但是,在某些时候,一个更复杂的机制开始出现。这涉及更多的磁盘I / O,这是数据库中最慢的部分。

另一种方法是删除“提交”过程的重要部分 - 用于刷新已提交事务的fsync。 ROLLBACK控制着这样的人。 “安全”的默认值可能是innodb_flush_log_at_trx_commit。许多人使用=1运行时安全性较低,但将fsyncs限制为每秒一次。 “不安全”部分是,如果您有电源故障,那么在最后一秒运行的任何事务可能已经被确认给客户端并实际上被持久化到磁盘。

由于该设置可能必须在连接之前完成,因此请考虑一个简单的3行=2脚本(文件):

.bat