diff --git a/db/migrate/20181026143227_migrate_snippets_access_level_default_value.rb b/db/migrate/20181026143227_migrate_snippets_access_level_default_value.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ede0ee27b8a3fcf415a5bf39e1353c4ec775a89f
--- /dev/null
+++ b/db/migrate/20181026143227_migrate_snippets_access_level_default_value.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class MigrateSnippetsAccessLevelDefaultValue < ActiveRecord::Migration
+  include Gitlab::Database::MigrationHelpers
+
+  DOWNTIME = false
+  ENABLED = 20
+
+  disable_ddl_transaction!
+
+  class ProjectFeature < ActiveRecord::Base
+    include EachBatch
+
+    self.table_name = 'project_features'
+  end
+
+  def up
+    change_column_default :project_features, :snippets_access_level, ENABLED
+
+    # On GitLab.com this will update about 28 000 rows. Since our updates are
+    # very small and this column is not indexed, these updates should be very
+    # lightweight.
+    ProjectFeature.where(snippets_access_level: nil).each_batch do |batch|
+      batch.update_all(snippets_access_level: ENABLED)
+    end
+
+    # We do not need to perform this in a post-deployment migration as the
+    # ProjectFeature model already enforces a default value for all new rows.
+    change_column_null :project_features, :snippets_access_level, false
+  end
+
+  def down
+    change_column_null :project_features, :snippets_access_level, true
+    change_column_default :project_features, :snippets_access_level, nil
+
+    # We can't migrate from 20 -> NULL, as some projects may have explicitly set
+    # the access level to 20.
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 488bb4e75dee7938f4d1bbbc1efdf0ac7a5460a9..4a9ae01d2e9084a52339773603752ba4a25a13a0 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -2161,7 +2161,7 @@ ActiveRecord::Schema.define(version: 20181031190559) do
     t.integer "merge_requests_access_level"
     t.integer "issues_access_level"
     t.integer "wiki_access_level"
-    t.integer "snippets_access_level"
+    t.integer "snippets_access_level", default: 20, null: false
     t.integer "builds_access_level"
     t.datetime "created_at"
     t.datetime "updated_at"