// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Configurando o Servidor de Banco de Dados MySQL no Sistema Operacional Windows
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Configurando o Servidor de Banco de Dados MySQL no Sistema Operacional Windows - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Configurando o Servidor de Banco de Dados MySQL no Sistema Operacional Windows

O servidor de banco de dados MySQL é um dos mais populares servidores de banco de dados de código-fonte aberto geralmente utilizado no desenvolvimento de aplicações Web.

Este documento recomenda uma sequência de etapas para configurar o servidor de banco de dados MySQL versões 5.6 no sistema operacional Windows. Ele não aborda os detalhes da configuração do MySQL, descreve a sequência de etapas necessária.

Para obter mais informações sobre instalação e configuração do servidor de banco de dados MySQL em outros sistemas operacionais, consulte a documentação link:http://dev.mysql.com/doc/refman/5.6/en/installing.html[+Instalando e Atualizando o MySQL+].

*Observação:* o documento link:../../72/ide/install-and-configure-mysql-server.html[+Configurando as versões do MySQL Database Server 5.1 no Sistema Operacional Windows+] oferece as instruções sobre configuração das versões 5.1 do MySQL Server no Windows.





== Iniciando o Download

1. Vá para link:http://dev.mysql.com/downloads/installer/[+http://dev.mysql.com/downloads/installer/+].
2. Clique no botão Fazer download.
3. Salve o arquivo do instalador no sistema.

<<top,início>>


== Iniciando a Instalação

Após concluir o download, execute o instalador, como a seguir:

1. Clique com o botão direito do mouse no arquivo de instalação transferido por download (por exemplo,  ``mysql-installer-community-5.6.10.0.msi`` ) e clique em Executar.
O Instalador do MySQL é iniciado.

[start=2]
. No painel de Boas-Vindas, selecione Instalar Produtos MySQL.

[start=3]
. No painel Informações da Licença, examine o contrato de licença, clique na caixa de seleção de aceitação e clique em Próximo.

[start=4]
. No painel Localizar produtos mais recentes, clique em Executar. 
Quando a operação for concluída, clique em Próximo.

[start=5]
. No painel Tipo de Configuração, escolha a opção Personalizada e clique em Próximo.

[start=6]
. No painel Seleção de Funcionalidade, verifique se MySQL Server 5.6.x foi selecionado e clique em Próximo.

[start=7]
. No painel Verificar Requisitos, clique em Próximo.

[start=8]
. No painel Instalação, clique em Executar.
Quando a instalação do servidor é concluída com sucesso, a mensagem de informações é exibida no painel Instalação. Clique em Próximo.

[start=9]
. No painel Configuração, clique em Próximo.

[start=10]
. Na primeira página Configuração do Servidor MySQL (1/3), consulte as opções a seguir:
* *Tipo de Configuração do Servidor*. Selecione a opção Máquina de Desenvolvimento.
* *Ativar Rede de TCP/IP*. Verifique se a caixa de seleção foi selecionada e especifique as opções abaixo:
* *Número da Porta*. Especifique a porta de conexão. A definição default é 3306 - não altere-a se não houver um motivo especial para isso.
* *Abra a porta do Firewall para obter acesso à rede*. Opte por adicionar a exceção de firewall para a porta especificada.
* *Configuração Avançada.* Marque a caixa de seleção Mostrar Opções Avançadas para exibir uma página adicional de configuração para definir opções avançadas para a instância do servidor, se necessário.

*Observação:* a escolha desta opção é necessária para se chegar ao painel para definir as opções de rede onde você desativará o firewall da porta usada pelo servidor MySQL.

Clique em Próximo.

[start=11]
. Na segunda página Configuração do Servidor MySQL (2/3), consulte as opções a seguir:
* *Senha da Conta Root*.
* *Senha Root de MySQL*. Informe senha para o usuário root.
* *Repita a Senha*. Digite novamente a senha root do usuário.

*Observação:* o usuário-raiz é um usuário que possui acesso total ao servidor de banco de dados MySQL - criação, atualização e remoção de usuários e assim por diante. Guarde a senha-raiz - você precisará dela posteriormente ao criar um banco de dados de amostra.

* *Contas do Usuário MySQL*. Clique em Adicionar Usuário para criar uma conta do usuário. Na caixa de diálogo Detalhes de Usuário do MySQL, insira um nome de usuário, uma função do banco de dados e uma senha (por exemplo,  ``!phpuser`` ). Clique em OK.
Clique em Próximo.

. Na terceira página Configuração do Servidor MySQL (3/3), consulte as opções a seguir:
* *Nome do Serviço Windows*. Especifique um Nome do Serviço Windows para ser usado para a instância do servidor do MySQL.
* *Inicie o MySQL na Inicialização do Sistema*. Deixe a caixa de seleção marcada se for necessário iniciar o servidor MySQL automaticamente no tempo de inicialização do sistema.
* *Executar Serviço do Windows como*. Escolha:
* *Conta Padrão do Sistema*. Recomendada para a maioria dos cenários.
* *Usuário Personalizado*. Uma conta de usuário existente recomendada para cenários avançados.
Clique em Próximo.

. Na página Visão Geral da Configuração, clique em Próximo.
. Quando a configuração do servidor for concluída com sucesso, a mensagem de informações será exibida no painel Concluir. Clique em Finalizar.

*Observação:* para verificar se a instalação foi concluída com êxito, execute o Gerenciador de Tarefas. Se o  ``MySQLd-nt.exe``  estiver na lista de Processos, o servidor de banco de dados está sendo executado.

<<top,início>>

link:/about/contact_form.html?to=3&subject=Feedback:%20Setting%20Up%20the%20MySQL%20Database%20Server%20in%20the%20Windows%20Operating%20System[+Enviar Feedback neste Tutorial+]



== Consulte Também

* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG1790[+Trabalhando e Conectando-se aos Bancos de Dados+] em _Desenvolvendo Aplicações com o NetBeans IDE_
* link:../../trails/php.html[+Trilha de Aprendizado do PHP+]
* link:mysql.html[+Conectando a um Banco de Dados MySQL+]
* link:http://www.mysql.com/why-mysql/java/[+MySQL e Java - Recursos+]
* link:http://dev.mysql.com/doc/refman/5.6/en/index.html[+Manual de Referência do MySQL 5.6+]

<<top,início>>

